繁体   English   中英

Android 等待 UI 线程失效

[英]Android wait for UI thread to invalidate

我在绘画应用程序中重绘视图时遇到问题。 当触摸结束时,我调用 touch_up() 来创建路径,调用 invalidate() 来绘制它,并调用 storeView() 来将当前视图压入堆栈。 然而,视图根本没有重绘(直到下一次触摸,给它一个抽搐的效果)。 如果我删除对 storeView() 的调用,它会立即重绘。

我从这里了解到问题是 invalidate() 不一定会立即发生,我认为我需要创建一个新线程或处理程序来等待它。 尽管阅读了开发页面,但我并不完全理解如何实现它。

这真的是我需要做的吗? 如何让 storeView() 等到视图被重绘? 我已经为此奋斗了一段时间,答案会让我开心。 谢谢!

这是我目前所做的。

行动:

case MotionEvent.ACTION_UP:
    touch_up();
    invalidate();
    storeView();
    break;

润色:

private void touch_up() {
    mPath.lineTo(mX, mY);
    // commit the path to our offscreen
    mCanvas.drawPath(mPath, mPaint);
    // kill this so we don't double draw
    mPath.reset();
}

商店视图:

public void storeView(){
    historyCount++;
    if(historyCount > historySize) historyCount = 6;    //We don't want more than 6
    history.add(Bitmap.createBitmap(myView.getDrawingCache()),historyCount);
}

当触摸结束时,我调用 touch_up() 来创建路径,调用 invalidate() 来绘制它,并调用 storeView() 来将当前视图压入堆栈。

为什么storeView()持有整个 bitmap? 为什么不使用可以重放(并且可能反转)的存储命令? 您正在以这种方式占用大量 RAM。

我从这里了解到问题是 invalidate() 不一定会立即发生

正确的。

我想我需要创建一个新的线程或处理程序来等待它。

不,如果您要坚持保存整个位图的实现,则需要确保在invalidate()完成后调用storeView() storeView()的调用包装在Runnable中并通过调用myViewpost()来安排Runnable就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM