如何序列化android.graphics.Path的对象

时间:2011-02-07 09:33:44

标签: android serialization memory path internal

我正在尝试将Android.graphics.Path的对象存储在内部设备内存中。有谁知道如何序列化android.graphics.Path对象?还有,还有其他存储Path对象的方法吗?谢谢。

3 个答案:

答案 0 :(得分:20)

我这样做的方法是从原始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类型的对象时,请确保让the default serialization protocol调用“drawThisPath”,以便重新绘制路径。

答案 1 :(得分:5)

我刚刚设法解决了这个问题。我的应用程序基于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()。

答案 2 :(得分:-1)

Path Class没有什么特别之处。使用可以序列化任何实现Serializable接口的类..

Serializable接口是Marker接口。即它没有任何实施方法。它只是表示该对象可以被解压缩到文件/ Memroies,以后可以再次被破坏为活动对象

你做的只是创建一个扩展android.graphics.Path类的类,并实现Serializable接口。然后使用此类而不是android.graphics.Path。然后,您就可以对其应用序列化。

并查看以下链接以获取详细信息

http://java.sun.com/developer/technicalArticles/Programming/serialization/

希望这会有所帮助:)