как сериализовать объект android.graphics.Path - PullRequest
14 голосов
/ 07 февраля 2011

Я пытаюсь сохранить объекты Android.graphics.Path во внутренней памяти устройства.Кто-нибудь знает, как сериализовать объект android.graphics.Path?А также, есть ли другой способ хранения объекта Path?Благодарю.

Ответы [ 3 ]

21 голосов
/ 15 ноября 2011

Способ, которым я это сделал, - определить нужные мне методы из исходного класса 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", поэтому путь перерисовывается.

5 голосов
/ 11 июля 2011

Мне только что удалось это решить. Мое приложение основано на 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 ().

0 голосов
/ 07 февраля 2011

Нет ничего особенного для Path Class. Использование может сериализовать любой класс, который реализует интерфейс Serializable.

Сериализуемый интерфейс - это маркерный интерфейс. Т.е. у него нет никакого метода для реализации. Это просто означает, что объект может быть дефлятирован в файлы / Memroies и позже может быть перекачан, чтобы снова стать живым объектом

Что вы делаете, просто создаете класс, который расширяет ваш класс android.graphics.Path и реализует интерфейс Serializable. Затем используйте этот класс вместо вашего android.graphics.Path. Тогда вы сможете применить сериализацию над ним.

и проверьте следующую ссылку для получения подробной информации

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

Надеюсь, это поможет:)

...