android重畫
① android 自定義View 怎麼重繪
修改顏色後調用invalidate()
在自定義View 中提供一個方法
public void setRectColor(int color){
colors[x][x] = color; //修改顏色
invalidate();
}
② android自定義 view組件重繪問題
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() {
public void run() {
onDraw(null);
invalidate();
}
});
}
}).start();
新線程實現了runnable介面但是 裡面的 第一個 run 方法只執行一次就退出了。應該加入循環不斷更新。而hander.post 里的那個runnable 外層每循環一次就post一次 所以不用加入循環語句。
boolean flag=true;
new Thread(new runnable{
public void run(){
try{
while(flag){
Thread.sleep(1);
handler.post(new Runnable() {
public void run() {
onDraw(null);
invalidate();
}
});
}catch (InterruptedException e) {
e.printStackTrace();
flag=flase;
}
}
}).start();
③ android圖像繪制——畫布保存為圖片
解釋:
1、首先創建一個Bitmap圖片,並指定大小;
2、在該圖片上創建一個新的畫布Canvas,然後在畫布上繪制,並保存即可;
3、需要保存的目錄File,注意如果寫的目錄如「/sdcard/akai/」如果不存在的話,要先創建(file.mkdirs()),否則FileOutputStream會報錯No found;
4、需要添加許可權:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
什麼是畫布呢 其實通過字面意思的理解就是用來繪畫的地方,那麼android里的畫布是神馬樣子的呢?
在自定義畫布中常用到下面3個類
Canvas
這些繪圖方法中的每一個都需要指定一個Paint對象來渲染它
Paint
Paint也稱為"刷子",Paint可以指定如何將基本圖形繪制到點陣圖上。
Paint類相當於一個筆刷和調色板。它可以選擇如何使用上面描述的draw方法來渲染繪 制在畫布上的基本圖形。通過修改Paint對象,可以在繪圖的時候控制顏色、樣式、字體和特殊效果。最簡單地,setColor可以讓你選擇一個Paint的顏色,而Paint對象的樣式(使用setStyle控制)則可以決定是繪制繪圖對象的輪廓(STROKE),還是只填充每一部 分(FILL),或者是兩者都做(STROKE_AND_FILL)除了這些簡單的控制之外,Paint類還支持透明度,另外,它也可以通過使用各種各樣的陰影、過濾器和效果進行修改,從而提供由更豐富的、復雜的畫筆和顏料組成的調色板。
從繼承View類(或其子類)開始,並定義onDraw()回調方法。系統會調用該方法來完 成View對象自己的繪制請求。這也是通過Canvas對象來執行所有的圖形繪制調用的地方,這個Canvas對象是由onDraw()回調方法傳入的。
Android框架只在必要的時候才會調用onDraw()方法,每次請求應用程序准備完成圖形 繪制任務時,必須通過調用invalidate()方法讓該View對象失效。這表明可以在該View 對象上進行圖形繪制處理了,然後Android系統會調用該View對象的onDraw()方(盡 管不保證該回調方法會立即被調用)。
在定製的View組件的onDraw()方法內部,使用給定的Canvas對象來完成所有的圖形繪制處理(如Canvas.draw…()方法或把該Canvas對象作為參數傳遞給其他類的draw() 方法)。一旦onDraw()方法被執行完成,Android框架就會使用這個Canvas對象來繪制一個有系統處理的Bitmap對象。
下面是Paint一些常用方法:
Bitmap
Bitmap繪圖的表面也稱點陣圖(這里詳細說哈點陣圖的功能)。
從資源中獲取點陣圖:
通過Resource的函數:InputStream openRawResource(int id)獲取得到資源文件的數據流後,可以通過2種方式獲得bitmap
使用BitmapDrawable :
使用BitmapDrawable(InputStream is)構造一個BitmapDrawable;
使用BitmapDrawable類的getBitmap()獲取得到點陣圖;
使用BitmapFactory使用BitmapFactory類decodeStream(InputStream is)解碼位 圖資源,獲取點陣圖BitmapFactory的所有函數都是static,這個輔助類可以通過資 源ID、路徑、文件、數據流等方式來獲取點陣圖。
獲取點陣圖的信息
一般獲取點陣圖信息包括:點陣圖大小、透明度、顏色格式等等,這些信息呢可以通過 三-一方法獲取得到Bitmap就迎刃而解了,Android SDK中對Bitmap有詳細說明,大家可以去詳細了解哈。
顯示點陣圖
顯示點陣圖需要使用核心類Canvas,可以直接通過Canvas類的drawBirmap()顯示點陣圖,或者藉助於BitmapDrawable來將Bitmap繪制到Canvas,下面的實例中會詳細列舉到
點陣圖的縮放
點陣圖的縮放,在Android SDK中提供了2種方法:
1:將一個點陣圖按照需求重畫一遍,畫後的點陣圖就是我們需要的了,與點陣圖的顯示幾乎 一樣:
drawBitmap(Bitmap bitmap, Rect src, Rectdst, Paint paint)
2:在原有點陣圖的基礎上,縮放原點陣圖,創建一個新的點陣圖:
createBitmap(Bitmap source, int x, int y,int width, int height, Matrix m, boolean filter)
點陣圖旋轉
點陣圖的旋轉,離不開Matrix。Android SDK提供了Matrix類,可以通過各種介面來設置 矩陣
android 處理圖片工具
截取視頻幀並轉化為Bitmap
④ android canvas view重繪 我在一個activity中調用了canvas。在canvas中我點擊事件需要重新繪制當前view
除了SurfaceView,其它的都必須通過調用View.invalidate方法刷新View
所以不能直接執行moren(canvas),需要在onTouchEvent調用invalidate