何为脏矩形?比如surfaceview上绘制旋转图片的时候,只刷新一个特定的矩形区域就可以了。这个矩形区域就是脏矩形。在surfaceview上 canvas = holder.lockCanvas(new Rect(0, 0, 130, 130)); //获取画布 像这种带rect参数的就是脏矩形的刷新。
请看源码:
package yan.guoqi.rectphoto;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class DrawSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
private static final String tag2 = "DrawSV";
private boolean runFlag = true;
protected SurfaceHolder holder;
private Bitmap rotateImg;
private Thread myThread;
public DrawSurfaceView(Context context, AttributeSet attrs)
//构造函数
{
super(context, attrs);
// TODO Auto-generated constructor stub
rotateImg = BitmapFactory.decodeResource(getResources(), R.drawable.rotate_circle);
rotateImg = Bitmap.createScaledBitmap(rotateImg, 100, 100, true);
holder = this.getHolder();
holder.addCallback(this);
holder.setFormat(PixelFormat.TRANSPARENT); //顶层绘制SurfaceView设成透明
this.setZOrderOnTop(true);
myThread = new Thread(new MyThread());
}
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
Log.v(tag2, "DrawSV:surfaceChanged...");
}
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
Log.v(tag2, "DrawSV:surfaceCreated...");
//启动自定义线程
myThread.start();
}
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
Log.v(tag2, "DrawSV:surfaceDestroyed...");
//终止自定义线程
runFlag = false;
myThread.interrupt();
}
/*自定义线程*/
class MyThread implements Runnable{
public void run() {
// TODO Auto-generated method stub
Canvas canvas = null;
int rotate = 0;
while(runFlag){
try {
canvas = holder.lockCanvas(new Rect(0, 0, 130, 130)); //获取画布
Paint paint = new Paint();
//canvas.drawBitmap(rotateImg, 0, 0, paint); //绘制旋转的背景
//创建矩阵控制图片旋转和平移
Matrix matrix = new Matrix();
//设置旋转角度
matrix.postRotate((rotate += 48) % 360,
rotateImg.getWidth() / 2, rotateImg.getHeight() / 2);
//设置左边距和上边距
matrix.postTranslate(0, 0);
//绘制旋转图片
canvas.drawBitmap(rotateImg, matrix, paint);
//休眠控制最大帧率为每秒3绘制30次
Thread.sleep(30);
holder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像
} catch (Exception e) {
// TODO: handle exception
Log.v(tag2, "DrawSurfaceView:绘制失败...");
}
}
}
}
}
需要注意的几点:
第一,就是如何安全中止一个线程。这里通过设置标志位来实现。因为自带的stop()方法不安全,android本身都不推荐。关于如何安全中止线程可以参考这里:http://www.iteye.com/problems/67052 http://www.dewen.org/q/1957
第二,holder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像 这句话必须和 canvas = holder.lockCanvas(new Rect(0, 0, 130, 130)); //获取画布 在一个{ }里。像这里的http://www.cnblogs.com/jqyp/archive/2012/01/01/2309692.html的做法在程序退出时会抛出异常。原因是线程中止的时候无法再解锁画布了。
第三,利用Matrix让图片旋转的核心代码:
//创建矩阵控制图片旋转和平移
Matrix matrix = new Matrix();
//设置旋转角度
matrix.postRotate((rotate += 48) % 360,
rotateImg.getWidth() / 2, rotateImg.getHeight() / 2);
//设置左边距和上边距
matrix.postTranslate(0, 0);
//绘制旋转图片
canvas.drawBitmap(rotateImg, matrix, paint);
//休眠控制最大帧率为每秒3绘制30次
Thread.sleep(30);
第四,之所以将此surfaceview设成顶层透明,原因是杂家想探索在底层surfaceview预览摄像头视频的时候,在顶层的surfaceview绘制一个旋转的图片动画。但遗憾的是,图片确实是旋转了,底层的摄像头预览也正常。但就是旋转的图片将预览画面挡住了。唉,看来前文http://blog.csdn.net/yanzi1225627/article/details/8580034这里的360扫描二维码的界面不是通过这种思路实现的,抑或是
我旋转的图片不是透明的???
分享到:
相关推荐
Android开发摄像头SurfaceView预览 背景画图(矩形和圆形) 实现(双surfaceview,顶层画矩形框,底层预览视频); UI:三个按钮 预览 摄像 图片保存,预览界面 可以显示(矩形和圆形等图画)
android SurfaceView添加线程源码
android surfaceview自定义拍照 绘制头像轮廓 注明:是借用网上的demo基础上进行修改的
详见我的博文: SurfaceView高性能绘制(三)代码实践篇-根据触屏绘制图片
Android的SurfaceView实现图片缩放、滑动,网上资源不多,目前还有些问题,仅供参考。
Android游戏框架SurfaceView介绍 PDF TAG:Android 游戏框架 SurfaceView
AndroidApp中使用SurfaceView制作多线程动画的实例讲解.docx
Android中使用surfaceview开发的Camera相机,内容含有注释,非常清楚
这是在上网收集的,能够截取当前Activity中surfaceView中图片。本人亲测可以通过。
详见博客:SurfaceView高性能绘制(二)代码实践篇-静态图片 有问题及时给我留言,看到会马上回复!
Android圆形相机预览窗口,圆形SurfaceView
详见我的博文:SurfaceView高性能绘制(五)代码实践篇-让绘制的图片运动 有问题及时给我留言,看到会尽管回复!
android demo,使用SurfaceView,使用多线程技术,可以滑动的选择按钮组,动画效果非常流畅,按钮数量可以随意改变。
android之surfaceview游戏开发
由于其拥有独立的绘图表面,因此SurfaceView的UI就可以在一个独立的线程中进行绘制。又由于SurfaceView不会占用主线程资源,一方面可以实现复杂而高效的UI,另一方面又不会导致用户输入得不到及时响应
SurfaceView和TextureView均继承于android.view.View 与其它View不同的是,两者都能在独立的线程中绘制和渲染,在专用的GPU线程中大大提高渲染的性能。 一、SurfaceView专门提供了嵌入视图层级的绘制界面,开发者...
Android下使用SurfaceView播放视频文件,详细参见博客:http://www.cnblogs.com/plokmju/p/android_SurfaceView.html
1、搜索制定目录下的本地视频,并显示缩略图及视频名称在列表上;2、点击播放指定视频或按顺序播放全部视频;3、包括进度条,播放和暂停键,时间显示等控件;4、可旋转屏幕;5保持视频尺寸(视频不被压缩)。 所用...
android View、SurfaceView Demo - 对应博客:http://blog.csdn.net/amoscxy/article/details/77480655
详见博文: SurfaceView高性能绘制(四)代码实践篇-绘制多张图片