0

在我的自定义视图中,我有 1 个动画需要按需运行(点击磁贴)。目前我正在使用这种方法:

 public boolean onTouchEvent(MotionEvent event) {
            switch(event.getAction()){

            case MotionEvent.ACTION_DOWN:
    //check what tile for clicked
                    getHandler().removeCallbacks(explosionThread); 
                    getHandler().post(explosionThread);
                    }

                }
            break;
        }
        return super.onTouchEvent(event);

    }

所以我正在调用(或发送到查看线程,具体而言)一个 Runnable,它自己调用它,直到图像结束......

private Runnable explosionThread=new Runnable(){
        @Override
        public void run() {
            invalidate();
            if(expCount<15){
            getHandler().postDelayed(this, 10);
            }
        }   
    };

在我的 onDraw() 方法中,我实现了扔位图并将其绘制在屏幕上的逻辑(使用 cnavas.drawBitmap(bitmap,srcRect,destRect,paint)....

现在,我想避免使用 SurfaceView(我只有 1 个动画,而 View 使用的资源更少)。我认为动画很慢,因为每次调用 invalidate() 时,onDraw 都需要绘制整个屏幕,这可能很慢(使用 png 图像绘制 64 个图块)。我知道 invalidate 方法 invalidate(Rect dirty) 有一个重载,但我真的不知道如何使用它。如果您认为这是答案,请写下如何避免绘制整个 onDraw 方法(或者我可以覆盖 invalidate(Rect) 方法使用的什么方法,如果有的话)。

如果您有任何其他更好的方法来加速动画,请发布它。提前致谢....

4

2 回答 2

0

运行动画是使用.gif文件还是使用在线程上运行的一系列图像以显示为动画?

于 2013-08-08T05:46:20.627 回答
0

这是正确的。通过画布加速渲染的方法之一是使用 invalidate(Rect)。传递给 invalidate 方法的 Rect 定义了将被重绘的区域。您的 onDraw 将在无效后调用,并在画布上设置剪辑区域。所以你所有的“drawBitmap”都会被矩形剪裁。

于 2013-08-08T02:13:56.150 回答