日期:2014-05-20  浏览次数:20810 次

如何实现局部刷新?我用了invalidate(Rect dirty)还是全局刷新。。。
本帖最后由 Javkburd 于 2013-09-04 17:34:25 编辑
  从MFC到现在的Android,这个invalidate实现局部刷新的我就没成功过,不知道到底该怎么弄,知道的不吝赐教。我的重绘是在子View的OnDraw里实现的。要么是全局刷新,要么就把上次画布上的所有图都清除了。部分代码如下:
public void onDraw(Canvas canvas) {

    super.onDraw(canvas);

int images[][] = MainActivity.images;
int number = images.length;
int canvasWidth = canvas.getWidth();
int imageWidth = canvasWidth / number;
Bitmap bmp = BitmapFactory.decodeResource(getResources(), images[0][0]);
int srcWidth = bmp.getWidth();
float scale = (float) imageWidth / srcWidth;

if (!isStarted) {

canvas.drawColor(Color.WHITE);

for (int i = 0; i < number; i++) {
for (int j = 0; j < number; j++) {
Random rand = new Random();
Bitmap srcBmp = BitmapFactory.decodeResource(
getResources(), images[rand.nextInt(number)][0]);

Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
Bitmap dstBmp = Bitmap
.createBitmap(srcBmp, 0, 0, srcBmp.getWidth(),
srcBmp.getHeight(), matrix, true);

canvas.drawBitmap(dstBmp, i * imageWidth, j * imageWidth,
null);
}
}

//isStarted = true;  //加上的话就只执行一次,下次刷新图就都没了;不加的话每次都是全局刷新,相当于重新加载了
//我想要的效果是第一次完全加载,以后就是局部刷新。
}
else
{
if(isTouched)
{

}
}
}


外部调用:
Rect DrawRect = new Rect(srcPosition.x*imageWidth, srcPosition.y*imageWidth,
tarPosition.x*imageWidth, tarPosition.y*imageWidth);

touchView.invalidate(DrawRect);
android canvas

------解决方案--------------------
invalidate()的调用是把之前的旧的view从主UI线程队列中pop掉。  这里不应该用它吧
------解决方案--------------------
View 里面用postinvalidate就会刷新屏幕,SurfaceView则不会,如果要到你想要的效果,只能用surfaceView了。要不然就用ArrayList<Rect>去储存你随机生成的Rect,然后用一个循环全部画出来。
------解决方案--------------------
复写画布里面的update方法,可以实现,想要效果好一点的话可以使用双缓冲技术实现刷新