跟隨手指運動的小球這個案例使用了自動以的UI組件,這個UI組件將會在指定位置繪製一個小球,這個位置會隨着我們的手指的拖動而改變。
原理就是使用程序來監聽我們手指的動作,把手指動作的位置傳入自定義UI組件,並通知該組件重繪即可。
效果圖片如下:
自定義組件代碼如下
public class DrawView extends View {
public float currentX = 40;
public float currentY = 50;
// 定義創建畫筆
Paint p = new Paint();
public DrawView (Context context){
super(context);
}
public DrawView(Context context, AttributeSet set){
super(context,set);
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
p.setColor(Color.RED); // 畫筆顏色
canvas.drawCircle(currentX,currentY,15,p);
}
@Override
public boolean onTouchEvent(MotionEvent event){
currentX = event.getX();
currentY = event.getY();
// 通知當前組件重繪自己
invalidate();
return true;
}
}
DrawView 組件繼承了View 基類,並重寫了 onDraw 方法 – 該方法負責在該組件的指定位置繪製一個小球。除此之外,該組件還重寫了 onTouchEvent 方法,該方法用於處理該組件的觸碰事件,當用戶手指觸碰該組件時將會激發該方法。當手指在觸摸屏上移動時,將會不斷的觸發觸屏事件,事件監聽器中負責觸發事件的座標將被傳入 DrawView 組件,並通知重繪。
視圖代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="pub.weber.bym.ball.MainActivity">
<pub.weber.bym.ball.DrawView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
MainActivity 代碼
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}