Android:如何在方向更改时保存自定义手指绘画视图

Android:如何在方向更改时保存自定义手指绘画视图,第1张

概述我正在尝试创建一个自定义视图,用户可以在其中绘制其签名.您可以在其中以编程方式将其放置到视图中并设置大小等.我之前没有做过此 *** 作,因此我将其基于androidapi演示的fingerpaint类.现在的问题是,它会在方向改变时擦除对象,我不确定如何使它不这样做.PaintView的代码private

我正在尝试创建一个自定义视图,用户可以在其中绘制其签名.您可以在其中以编程方式将其放置到视图中并设置大小等.我之前没有做过此 *** 作,因此我将其基于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:如何在方向更改时保存自定义手指绘画视图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1087414.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存