【问题标题】:invalidate only works in custom view无效仅适用于自定义视图
【发布时间】:2011-04-12 04:09:47
【问题描述】:

所以我创建了一个名为“drawable view”的视图

 class DrawableView extends View{
        Context mContext;

        int touches=0,k,Xoffs,clicks=0;


  double x_1 = 0,x_2=0;

        private float mLastTouchX, mLastTouchY;

        public DrawableView(Context context) {
        super(context);
        mContext = context;
        }

....
    @Override
    protected void onDraw(Canvas canvas){

        Paint myPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

canvas.drawColor(Color.BLUE);
myPaint.setColor(Color.WHITE);

canvas.drawCircle(200, 100, 20, myPaint);


    }

..... more code....

}

而且只能在 ondraw 命令中失效!即:调用“invalidate();”在 ondraw 命令结束时会导致它循环。

我已经多次尝试调用 g_draw.invalidate();或 g_draw.postInvalidate(); (g_draw 是创建的可绘制视图的名称)来自其他类甚至主活动类,它不起作用。为什么以及如何解决?

谢谢

【问题讨论】:

    标签: android invalidation


    【解决方案1】:

    如果您想连续调用 onDraw,请尝试在另一个线程中执行此操作。创建一个线程,并从其运行方法尝试执行 postInvalidate。

    它总是对我有用。

    另一件事是,当你画一次圆圈时,下一次不会有任何区别 - 它看起来会一样。

    【讨论】:

    • 是的,这只是一些测试代码......它的 X 坐标应该是 X_1,它在别处已更新。我修复了它,我有两个“g_draw”实例,一个在主活动类中,一个在我的菜单类中……这导致它永远不会更新。删除了菜单类中的那个,现在我可以从线程中调用 postinvalidate 了。感谢您的回复!
    【解决方案2】:

    您可能想在 DrawableView 类的某处调用 invalidate()。例如,如果您希望您的视图在任何触摸事件之后重绘自身,您可以执行以下操作:

    public boolean onTouchEvent( MotionEvent event) {
    
        if(event.getAction() == MotionEvent.ACTION_UP){
            invalidate();
        }
    }
    

    这就是我在益智游戏中绘制可移动棋子的方式。

    【讨论】:

      猜你喜欢
      • 2021-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 2019-04-20
      • 1970-01-01
      • 2014-02-28
      • 2015-07-18
      相关资源
      最近更新 更多