我的代码工作正常,直到旋转表格或设备。当旋转时,绘图被清除,我学到了它,因为当设备旋转时,活动重新开始。 我的问题是如何重绘并将数据保存到onSaveInstanceState。 许多人说我必须使用onSaveInstanceState来保存绘图,但是当我必须保存的数据类型是Path时,我不知道该怎么做。
这是我的代码片段
public class MyDrawView extends View implements OnTouchListener {
MyDrawView drawView;
float prevX = 0;
float prevY = 0;
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
private Paint mPaint;
private int w,h;
private ArrayList<Path> paths = new ArrayList<Path>();
private ArrayList<Paint> bitPaints = new ArrayList<Paint>();
private ArrayList<Paint> pathPaints = new ArrayList<Paint>();
Paint tempPaint;
private String filename="";
public MyDrawView(Context c,String filename) {
super(c);
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
this.filename=filename;
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(Color.RED);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(6);
tempPaint=new Paint(mPaint);
mCanvas = new Canvas();
mPath = new Path();
if (rotated){
setDefaultDrawing();
}
}
public void setDefaultDrawing()
{
}
public Bitmap getBitmap(){
return this.mBitmap;
}
public void setStrokeWidth(float width){
mPaint.setStrokeWidth(width);
}
public void setColor(int color){
mPaint.setColor(color);
}
public String getFileName(){
return this.filename;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
this.w=w;
this.h=h;
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
Path tempPath=new Path(mPath);
paths.add(tempPath);
Paint tempPaint=new Paint(mPaint);
pathPaints.add(tempPaint);
Paint tempBitPaint=new Paint(mBitmapPaint);
bitPaints.add(tempBitPaint);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
答案 0 :(得分:0)
我想通了,因为Path是一个自定义对象,我创建了一个将保存Path的类对象,这样,我就可以在我的onSaveInstanceState中保存类对象并使用相同的类对象检索它。 / p>
答案 1 :(得分:0)
对于任何偶然发现此问题的人。您需要创建一个包含Path的类,并且该路径需要实现Parcelable。
例如
public static class CustomPath extends Path implements Parcelable {
private Path path;
public CustomPath() {
}
protected CustomPath(Parcel in) {
path = (Path) in.readValue(Path.class.getClassLoader());
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeValue(path);
}
@SuppressWarnings("unused")
public final Parcelable.Creator<CustomPath> CREATOR = new Parcelable.Creator<CustomPath>() {
@Override
public CustomPath createFromParcel(Parcel in) {
return new CustomPath(in);
}
@Override
public CustomPath[] newArray(int size) {
return new CustomPath[size];
}
};
}
完成后,需要将CustomPath保存到活动方法onSaveInstanceState()
示例
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("_Canvas", _DrawingView.getPath());
}
然后在您的onViewStateRestored()
中恢复先前的画布
示例:
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
_DrawingView.setPath(savedInstanceState.getParcelable("_Canvas"));
}
显然要检查密钥是否存在,并且Bundle不为空。
奖金,以在“画布”更改大小时调整路径的大小。添加以下代码
Matrix scaleMatrix = new Matrix();
RectF rectF = new RectF();
path.computeBounds(rectF, true);
scaleMatrix.setScale(1.25f, 1.25f,rectF.centerX(),rectF.centerY());
path.transform(scaleMatrix);