Я пытаюсь хранить объекты Android.graphics.Path во внутренней памяти устройства. Кто-нибудь знает, как сериализовать объект android.graphics.Path? А также есть ли другой способ хранения объекта Path? Благодарю.
Как сериализовать объект android.graphics.Path
Ответ 1
Как я это сделал, это определить методы, которые мне нужны из исходного класса 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", поэтому в этом случае я просто держу информацию о чертеже в списке. Этот список содержит информацию о чертеже (то, что я называю "действием" ), необходимым для пути, чтобы восстановить чертеж так, как он выглядел до того, как объект был сериализован. Затем, когда я десериализую свои объекты типа CustomPath, я уверен, что протокол сериализации по умолчанию вызывает "drawThisPath", поэтому путь перерисовывается.
Ответ 2
Мне только удалось это решить. Мое приложение основано на FingerPaintDemo, поэтому использует только moveTo и quadTo, но я думаю, вы можете применить этот подход к любым функциям 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(новый float [] {x1, y1, x2, y2}).
Сериализуйте объект на диск как обычно, и когда вы его прочитали, просто обязательно вызовите myPath.loadPathPointsAsQuadTo().
Ответ 3
В классе Path нет ничего особенного. Использование может сериализовать любой класс, реализующий интерфейс Serializable.
Интерфейс Serializable - это интерфейс Marker. т.е. у него нет какого-либо метода для реализации. Это просто означает, что объект может быть deflatted к файлам /Memroies, а затем может быть раздутым, чтобы быть живым объектом снова
Что вы делаете, просто создайте класс, который расширяет класс android.graphics.Path и реализует интерфейс Serializable. Затем используйте этот класс вместо вашего android.graphics.Path. Затем вы сможете применить к нему сериализацию.
И проверьте следующую ссылку для получения подробной информации
http://java.sun.com/developer/technicalArticles/Programming/serialization/
Надеюсь, что это поможет:)