Android.graphics.Path のオブジェクトをデバイスの内部メモリに保存しようとしています。android.graphics.Path オブジェクトをシリアル化する方法を知っている人はいますか? また、Path オブジェクトを格納する他の方法はありますか? ありがとう。
3 に答える
私が行った方法は、元の Path クラスから必要なメソッドを特定し、次のようにそれらのメソッドを単純にオーバーライドすることです。
public class CustomPath extends Path implements Serializable {
private static final long serialVersionUID = -5974912367682897467L;
private ArrayList<PathAction> actions = new ArrayList<CustomPath.PathAction>();
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
in.defaultReadObject();
drawThisPath();
}
@Override
public void moveTo(float x, float y) {
actions.add(new ActionMove(x, y));
super.moveTo(x, y);
}
@Override
public void lineTo(float x, float y){
actions.add(new ActionLine(x, y));
super.lineTo(x, y);
}
private void drawThisPath(){
for(PathAction p : actions){
if(p.getType().equals(PathActionType.MOVE_TO)){
super.moveTo(p.getX(), p.getY());
} else if(p.getType().equals(PathActionType.LINE_TO)){
super.lineTo(p.getX(), p.getY());
}
}
}
public interface PathAction {
public enum PathActionType {LINE_TO,MOVE_TO};
public PathActionType getType();
public float getX();
public float getY();
}
public class ActionMove implements PathAction, Serializable{
private static final long serialVersionUID = -7198142191254133295L;
private float x,y;
public ActionMove(float x, float y){
this.x = x;
this.y = y;
}
@Override
public PathActionType getType() {
return PathActionType.MOVE_TO;
}
@Override
public float getX() {
return x;
}
@Override
public float getY() {
return y;
}
}
public class ActionLine implements PathAction, Serializable{
private static final long serialVersionUID = 8307137961494172589L;
private float x,y;
public ActionLine(float x, float y){
this.x = x;
this.y = y;
}
@Override
public PathActionType getType() {
return PathActionType.LINE_TO;
}
@Override
public float getX() {
return x;
}
@Override
public float getY() {
return y;
}
}
}
私の例では、「moveTo」と「lineTo」が必要なので、この場合は描画情報をリストに保持するだけです。このリストには、オブジェクトがシリアル化される前のように見えるように描画を復元するために Path が必要とする描画情報 (私が「アクション」と呼ぶもの) が含まれています。次に、CustomPath 型のオブジェクトをデシリアライズするときに、デフォルトのシリアライゼーション プロトコルで "drawThisPath" を呼び出すようにして、パスが再描画されるようにします。
私はこれをなんとか解決できました。私のアプリケーションはFingerPaintDemoに基づいているので、moveToとquadToだけを使用しますが、このアプローチは任意のPath関数に適用できると思います。
まず、Pathを次のように拡張します。
import android.graphics.Path;
import java.util.ArrayList;
import java.io.Serializable;
public class SerializablePath extends Path implements Serializable {
private ArrayList<float[]> pathPoints;
public SerializablePath() {
super();
pathPoints = new ArrayList<float[]>();
}
public SerializablePath(SerializablePath p) {
super(p);
pathPoints = p.pathPoints;
}
public void addPathPoints(float[] points) {
this.pathPoints.add(points);
}
public void loadPathPointsAsQuadTo() {
float[] initPoints = pathPoints.remove(0);
this.moveTo(initPoints[0], initPoints[1]);
for (float[] pointSet : pathPoints) {
this.quadTo(pointSet[0], pointSet[1], pointSet[2], pointSet[3]);
}
}
}
実装コードを貼り付ける必要はないと思いますが、ご覧になりたい場合はお知らせください。基本的に、myPath.quadTo(x1、y1、x2、y2)のようなものを呼び出すのと同じように、myPath.addPathPoints(new float [] {x1、y1、x2、y2})も呼び出します。
通常どおりオブジェクトをディスクにシリアル化します。オブジェクトを読み戻すときは、必ずmyPath.loadPathPointsAsQuadTo()を呼び出してください。
パスクラスには特別なことは何もありません。Serializable インターフェイスを実装する任意のクラスをシリアライズできます。
Serializable インターフェイスは Marker インターフェイスです。つまり、実装する方法がありません。オブジェクトをファイル/メモリに解凍し、後で再びライブオブジェクトにするためにインフレートできることを示しているだけです
android.graphics.Path クラスを拡張し、Serializable インターフェイスを実装するクラスを作成するだけです。次に、android.graphics.Path の代わりにこのクラスを使用します。その後、シリアル化を適用できます。
http://java.sun.com/developer/technicalArticles/Programming/serialization/
お役に立てれば :)