我正在尝试创建一个自定义视图,用户可以在其中绘制其签名.您可以在其中以编程方式将其放置到视图中并设置大小等.我之前没有做过此 *** 作,因此我将其基于android API演示的fingerpaint类.现在的问题是,它会在方向改变时擦除对象,我不确定如何使它不这样做.
PaintVIEw的代码
private Bitmap mBitmap;private Canvas mCanvas;private Path mPath;private Paint mBitmapPaint;private boolean mDrawPoint;private int statetoSave;private Paint mPaint;public PaintVIEw(Context context) { super(context); System.out.println("init"); mPath = new Path(); mBitmapPaint = new Paint(Paint.DITHER_FLAG); setupPaint();}private voID setupPaint(){ mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setcolor(0xFF000000); mPaint.setStyle(Paint.Style.stroke); mPaint.setstrokeJoin(Paint.Join.ROUND); mPaint.setstrokeCap(Paint.Cap.ROUND); mPaint.setstrokeWIDth(4);}@OverrIDeprotected voID onSizeChanged(int w, int h, int olDW, int oldh) { super.onSizeChanged(w, h, olDW, oldh); System.out.println("w "+w+" h "+h+" olDW "+olDW+" oldh "+oldh); mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap);}@OverrIDeprotected voID onDraw(Canvas canvas) { System.out.println("on draw"); canvas.drawcolor(0xFFAAAAAA); canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); canvas.drawPath(mPath, mPaint);}private float mX, mY;private static final float touch_TolERANCE = 4;private voID touch_start(float x, float y) { mPath.reset(); mPath.moveto(x, y); mX = x; mY = y; mDrawPoint=true;}private voID touch_move(float x, float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= touch_TolERANCE || dy >= touch_TolERANCE) { mDrawPoint=false; mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); mX = x; mY = y; }}private voID touch_up() { if(mDrawPoint == true) { mCanvas.drawPoint(mX, mY, mPaint); } else { mPath.lineto(mX, mY); // commit the path to our offscreen mCanvas.drawPath(mPath, mPaint); // kill this so we don't double draw mPath.reset(); }}@OverrIDepublic boolean ontouchEvent(MotionEvent event) { getParent().requestdisallowIntercepttouchEvent(true); float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touch_start(x, y); invalIDate(); break; case MotionEvent.ACTION_MOVE: touch_move(x, y); invalIDate(); break; case MotionEvent.ACTION_UP: touch_up(); invalIDate(); break; } return true;}
作为一项迷你测试,我加入了
@OverrIDepublic Parcelable onSaveInstanceState() { System.out.println("save instance"); statetoSave++; Bundle bundle = new Bundle(); bundle.putParcelable("instanceState", super.onSaveInstanceState()); bundle.putInt("statetoSave", this.statetoSave); return bundle;}@OverrIDepublic voID onRestoreInstanceState(Parcelable state) { System.out.println("on restore"); if (state instanceof Bundle) { System.out.println("on restore"); Bundle bundle = (Bundle) state; this.statetoSave = bundle.getInt("statetoSave"); super.onRestoreInstanceState(bundle.getParcelable("instanceState")); System.out.println(statetoSave); return; } super.onRestoreInstanceState(state);}
但是onRestoreInstance()和onSaveInstance()永远不会在方向更改时被调用.这是我进行paintvIEw活动的oncreate中的代码.
relativeLayout inner= (relativeLayout) findVIEwByID(R.ID.inner); int wIDth=600; int height=360; float X= 100; float Y=60; LayoutParams wrapped = new LayoutParams(wIDth,height); PaintVIEw painting=new PaintVIEw(this); painting.setX(X); painting.setY(Y); painting.setLayoutParams(wrapped); inner.addVIEw(painting);
编辑:我想出了为什么saveinstancestate没有调用,我必须给VIEw提供一个ID,然后它才能工作.
painting.setID(4);
现在,我需要弄清楚如何使其保存图形.
解决方法:
您需要确保您的视图为saveEnabled,请尝试:
setSaveEnabled(true);
您可以从PaintVIEw的构造函数中执行此 *** 作.
另外,您可能需要确保在方向改变时您的活动被销毁/重新创建.确保您没有:
<activity name="?"androID:configChanges="keyboardHIDden|orIEntation"/>
使用此VIEw为该活动声明的活动,否则该活动不会在方向更改时被破坏.另外,如果您在这些活动中覆盖了onSaveInstanceState / * onRestoreInstanceState *,则需要调用相应的超类方法,即super.onSaveInstanceState()或super.onRestoreInstanceState()).
至于如何实际重新创建或保存图像以改变方向,如何保存以某种可打包列表完成的每个事件的方式.将该列表保存在onSaveInstanceState中,然后将其还原到onRestoreInstanceState中.然后获取事件列表并遍历事件列表,调用相应的绘制函数.
您可能需要根据新方向对X,Y值进行一些转换.
代码看起来像这样:
public class PaintVIEw extends VIEw { private static final String EXTRA_EVENT_List = "event_List";private static final String EXTRA_STATE = "instance_state";private ArrayList<MotionEvent> eventList = new ArrayList<MotionEvent>(100); @OverrIDe public boolean ontouchEvent(MotionEvent event) { getParent().requestdisallowIntercepttouchEvent(true); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: performtouchEvent(event); } return true; } private voID performtouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touch_start(x, y); break; case MotionEvent.ACTION_MOVE: touch_move(x, y); break; case MotionEvent.ACTION_UP: touch_up(); break; } invalIDate(); eventList.add(MotionEvent.obtain(event)); } } @OverrIDe public Parcelable onSaveInstanceState() { System.out.println("save instance"); Bundle bundle = new Bundle(); bundle.putParcelable(EXTRA_STATE, super.onSaveInstanceState()); bundle.putParcelableArrayList(EXTRA_EVENT_List, eventList); return bundle; } @OverrIDe public voID onRestoreInstanceState(Parcelable state) { if (state instanceof Bundle) { Bundle bundle = (Bundle) state; super.onRestoreInstanceState(bundle.getParcelable(EXTRA_STATE)); eventList = bundle.getParcelableArrayList(EXTRA_EVENT_List); if (eventList == null) { eventList = new ArrayList<MotionEvent>(100); } for (MotionEvent event : eventList) { performtouchEvent(event); } return; } super.onRestoreInstanceState(state); }}
总结 以上是内存溢出为你收集整理的Android:如何在方向更改时保存自定义手指绘画视图全部内容,希望文章能够帮你解决Android:如何在方向更改时保存自定义手指绘画视图所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)