Docker 的優點
804
2025-04-01
1.要了解多點觸控,我們必須先了解一下View的生命周期,畢竟在Android用的到多點觸控的地方,一般都是自定義控件。就像Fragment和Activity都有生命周期一樣,View也有自己的生命周期。該生命周期并不直接和展示它的Fragment或者Activity相連,相反,它和顯示它的窗口狀態已經渲染循環相關。
當視圖被添加到View層次結構中時,第一個被回調的函數是View.onAttachedToWindow(),這標志著它現在可以加載所需的資源了,構建自定義視圖時,開發者應該重載該方法,并在該方法中加載所有資源并初始化視圖所需的依賴。基本上,所有耗時的初始化操作都應放在該方法中。
還有一個匹配的回調名為View.onDetachedFromWindow(),從View層次結構中移除視圖時調用這個方法。在這里,你需要關注那些需要顯式清理的操作,比如所有被加載的資源,啟動的Service,或者其他依賴。
試圖被添加到View層次結構中之后,它會經過一個循環,該循環首先計算動畫,接下來會依次調用View.onMeasure(),View.onLayout(),View.onDraw()等方法。系統會確保這些方法每次都按完全相同的順序被調用.
View的生命周期如下:
View.onAttachedToWindow()--->動畫視圖--->View.onMeasure()--->View.onLayout()--->View.onDraw()--->View.onDetachedFromWindow();
在onLayout()方法中,計算每個按鍵的大小和位置,在onDraw()方法中,應避免執行任何耗時的操作,而只關注實際的繪制,從而避免潛在的性能問題.onMeasure()一般配合onlayout一起使用。
當手指按下屏幕的時候系統會回調View的onTouchEvent();所以多點觸控的大部分代碼都寫在該方法中.
2.多點觸控
多點觸控的基本方法和參數
public?boolean?onTouchEvent(MotionEvent?event)
參數event:參數event為手機屏幕觸摸事件封裝類的對象,其中封裝了該事件的所有信息,例如觸摸的位置、觸摸的類型以及觸摸的時間等。該對象會在用戶觸摸手機屏幕時被創建。
返回值:該方法的返回值機理與鍵盤響應事件的相同,同樣是當已經完整地處理了該事件且不希望其他回調方法再次處理時返回true,否則返回false。
event.getAction() //獲取觸控動作比如ACTION_DOWN
event.getPointerCount(); //獲取觸控點的數量,比如2則可能是兩個手指同時按壓屏幕
event.getPointerId(nID); //對于每個觸控的點的細節,我們可以通過一個循環執行getPointerId方法獲取索引
event.getX(nID); //獲取第nID個觸控點的x位置
event.getY(nID); //獲取第nID個點觸控的y位置
event.getPressure(nID); //LCD可以感應出用戶的手指壓力,當然具體的級別由驅動和物理硬件決定的
event.getDownTime() //按下開始時間
event.getEventTime() // 事件結束時間
event.getEventTime()-event.getDownTime()); //總共按下時花費時間
event.getActionIndex()//獲取觸摸手指的坐標ID也是上面的nID
event.getPointerCount()//獲取有多少個手指按下
當然這里有個小小變化,在Android4.2以后,就基本不getAction獲取觸摸動作而是用event.getActionMasked()代替.
下面寫一小段程序供參考:
public class MyView extends View {
public MyView(Context context) {
super(context);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
}
//因為舉例簡單起見,按照480*800的手機繪制的四個矩形
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setStyle(Style.STROKE);
canvas.drawRect(0, 0, 480, 200, paint);
canvas.drawRect(0, 200, 480, 400, paint);
canvas.drawRect(0, 400, 480, 600, paint);
canvas.drawRect(0, 600, 480, 800, paint);
}
//具體酷炫的操作都寫在這里,比如以四個矩形為鋼琴鍵,播放特定音效等等
@Override
public boolean onTouchEvent(MotionEvent event) {
int pointerCount = event.getPointerCount();//獲取有多少個手指按下
int actionIndex = event.getActionIndex();//獲取手指按下的唯一索引
int action = event.getActionMasked();//獲取按鍵的特征
int id = event.getPointerId(actionIndex);//獲取索引
if ((action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN)) {
Log.i("MyView", event.getX(actionIndex)+"-" + event.getY(actionIndex));
}
return true;
}
}
上面程序是不是少了一個onLayout()方法,沒錯,在此方法里面就可以根據特定手機繪制特定的圖形,因為本文具體講解多點觸控,不在于介紹完整的實例故略過。
Android
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。