何為臟矩形?比如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掃描二維碼的界面不是通過這種思路實現的,抑或是 我旋轉的圖片不是透明的??? ?****
- 前言
- Linux下使用QT調用opencv讀取攝像頭視頻 調試心得
- Android開發 攝像頭SurfaceView預覽 背景帶矩形框 實現(原理:雙surfaceview,頂層畫矩形框,底層預覽視頻)
- Android開發:安裝NDK,移植OpenCV2.3.1,JNI調用OpenCV全過程
- 2013新春奉送:Android攝像頭開發完美demo---(循環聚焦,縮放大小,旋轉picture,查詢支持的picturesize, ImageButton按鍵效果)
- 如何設置ImageButton按鍵按下去后的 特效----(如類似風車旋轉的動畫特效)
- Android攝像頭:只拍攝SurfaceView預覽界面特定區域內容(矩形框)---完整實現(原理:底層SurfaceView+上層繪制ImageView)
- Android開發:SurfaceView上新建線程繪制旋轉圖片 及 刷新特定區域(臟矩形)
- Android開發:ImageView上繪制旋轉圓環(透明度不同的旋轉圓環,利用canvas.drawArc實現)
- Android上掌紋識別第一步:基于OpenCV的6種膚色分割 源碼和效果圖
- Android開發:實時處理攝像頭預覽幀視頻------淺析PreviewCallback,onPreviewFrame,AsyncTask的綜合應用
- Android攝像頭開發:拍照后添加相框,融合相框和圖片為一副 圖片
- Android(OpenCV) NDK開發: 0xdeadbaad(code=1)錯誤 及 關閉armeabi和libnative_camera_r2.2.2.so的生成
- Android攝像頭開發:實時攝像頭視頻預覽幀的編碼問題(二)
- setContentView切換頁面(無需每次都findViewById)-----二
- Android開發:setContentView切換界面,自定義帶CheckBox的ListView顯示SQlite條目-----實現