postinvalidate() ,invalidate() 區別
postinvalidate() 用在子執行緒向ui執行緒傳送介面重新整理訊息請求,
invalidate()呼叫直接在ui執行緒重新整理介面。
第1種情況 postinvalidate();
package com.ganstyle.activity;
import android.r;
import android.content.context;
import android.graphics.bitmap;
import android.graphics.bitmapfactory;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.matrix;
import android.graphics.paint;
import android.graphics.paint.style;
import android.util.log;
import android.view.keyevent;
import android.view.motionevent;
import android.view.view;
import android.widget.switch;
public class gameview extends view
@override
protected void ondraw(canvas canvas)
mythread t=null;
@override
public boolean onkeydown(int keycode, keyevent event) 執行這個方法不會在主線程重繪,因為onkeydown 在主線執行,
//由於迴圈時間過長,主線不會進重繪,所以要另乙個執行緒 mythread t 執行緒執行迴圈,
switch (keycode)system.out.println("gameview "+ keycode );
//設定返回鍵生效
case keyevent.keycode_back:
return super.onkeydown(keycode, event);
default :
break;}//
return super.onkeydown(keycode, event);
return true; //設定為true,表示不向下面的元件或view傳遞
}@override
public boolean ontouchevent(motionevent event)
private class mythread extends thread catch (interruptedexception e)
log.i("mythread", string.valueof(thread.currentthread().getid()));
gameview.this.postinvalidate();}}}
}第2種情況 invalidate(); 根據handler 收到的訊息,對介面進行重繪
package com.ganstyle.activity;
import android.content.context;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.paint;
import android.graphics.paint.style;
import android.os.handler;
import android.os.message;
import android.util.log;
import android.view.keyevent;
import android.view.motionevent;
import android.view.view;
public class handlegameview extends view
log.i("handler", string.valueof(thread.currentthread().getid()));
}
};public handlegameview(context context)
@override
protected void ondraw(canvas canvas)
mythread t=null;
@override
public boolean onkeydown(int keycode, keyevent event) 執行這個不會在主線程重繪
switch (keycode)system.out.println("gameview "+ keycode );
//設定 返回鍵 生效
case keyevent.keycode_back:
return super.onkeydown(keycode, event);
default :
break;
}//return super.onkeydown(keycode, event);
return true; //設定為true,表示不向下面的元件或view傳遞
}@override
public boolean ontouchevent(motionevent event)
private class mythread extends thread catch (interruptedexception e)
log.i("mythread", string.valueof(thread.currentthread().getid()));
message message = new message();
message.what = 1;
handler.sendmessage(message);}}}
}
Android自定義View 自定義元件
自繪控制項也分兩種,自定義元件和自定義容器,自定義元件是繼承view類,自定義容器時繼承viewgrounp 今天主要分析下自定義元件 還是舉個例子來的實際些,假如我們要畫乙個最簡單的textview,首先想到的就是canvas.drawtext 方法,怎麼畫了?還是得一步一步來 1 寫乙個myte...
Android自定義View 一 View的測量
想要讓系統繪製出你所需要的圖形,就必須告訴系統view的大小,所以,在繪製view時,先實現view的onmesure 方法。在測量view之前,要先了解measurespec這個類,measurespec物件中包含了測量的模式和測量的大小 measurespec.exactly 精確模式 當我們將...
Android自定義View實現
android自定義view實現很簡單 繼承view或者其子類,重寫建構函式 ondraw,onmeasure 等函式,根據繼承的類的不同可能有所不同。如果自定義的view需要有自定義的屬性,需要在values下建立attrs.xml。在其中定義你的屬性。在使用到自定義view的xml布局檔案中需要...