佈局文件:java
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".CustomViewActivity" android:id="@+id/root" android:orientation="vertical"> </LinearLayout>
自定義類:android
這個類必須寫在一個獨立的java文件中canvas
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、currentY兩個屬性 currentX = event.getX(); currentY = event.getY(); // 通知當前組件重繪本身 invalidate(); // 返回true代表該處理方法已經處理該事件 return true; } }
將組件添加到容器中去ide
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout root=(LinearLayout) findViewById(R.id.root); final myDrawView draw=new myDrawView(this); draw.setMinimumWidth(300); draw.setMinimumHeight(500); root.addView(draw); } }
也能夠在佈局文件里加載自定義的組件。把佈局文件修改以下:佈局
Android studio在寫佈局文件的時候,代碼補全能夠偵測到自定義組件的名字,確實很智能。this
<?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:layout_width="match_parent" android:layout_height="match_parent" tools:context="myDrawView" android:id="@+id/root" android:orientation="vertical"> <allegro.mydrawview.myDrawView android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
這樣在java代碼中沒必要要額外寫代碼加載自定義的組件了。下面的代碼已經註釋了加載組件的代碼。spa
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /*LinearLayout root=(LinearLayout) findViewById(R.id.root); final myDrawView draw=new myDrawView(this); draw.setMinimumWidth(300); draw.setMinimumHeight(500); root.addView(draw);*/ } }
這個程序的效果是,隨手指移動的小球。code