需要繼承 View 或 ViewGroup
需要了解自定義的類中,需實現三種方法(在MainActivity的onResume方法之后進行的)
/** * 測量 擺放 繪制 * measure -> layout -> draw * onMeasure onLayout onDraw * * View * onMeasure(指定自己寬高) onDraw 繪制自己內容 * * ViewGroup * onMeasure(指定自己寬高,所有子View寬高) onLayout(擺放所有子View) onDraw 繪制內容 * */
預先准備兩張圖片
1)新建ToggleView類,繼承 android.view.View
public class ToggleView extends View { /** * 用於代碼創建 */ public ToggleView(Context context) { super(context); } /** * 用於xml創建,可指定自定義屬性 */ public ToggleView(Context context, AttributeSet attrs) { super(context, attrs); } /** * 用於xml創建,可指定自定義屬性.(如果指定了樣式) */ public ToggleView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } }
2)在MainActivity的layout:activity_main中加入自定義View
<com.f.customeview.Custome.ToggleView android:id="@+id/toggleBtn" android:layout_height="wrap_content" android:layout_width="wrap_content"> </com.f.customeview.Custome.ToggleView>
3)預想自定義的滑動按鈕需要哪些方式進行屬性設定,假設現在MainActivity自定義幾個方法:
private ToggleView toggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toggle = findViewById(R.id.toggleBtn); toggle.setSwitchBackgroundResource(R.drawable.switch_bg);//設置按鈕背景 toggle.setSlideButtonResource(R.drawable.toggle);//設置滑動的圖片 toggle.setSwitchState(false);//設置按鈕的狀態 }
在ToggleView
public void setSwitchBackgroundResource(int background){ toggleBackgroundBitmap = BitmapFactory.decodeResource(getResources(),background); } public void setSlideButtonResource(int slideButton){ slideButtonBitmap = BitmapFactory.decodeResource(getResources(),slideButton); } public void setSwitchState(boolean mSwitchState) {
this.mSwitchState = mSwitchState;
}
通過 onMeasure onDraw方法進行繪制
private Bitmap toggleBackgroundBitmap; private Bitmap slideButtonBitmap; private Paint paint;
private boolean mSwitchState;
/** * 用於代碼創建 */ public ToggleView(Context context) { super(context); init(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(toggleBackgroundBitmap.getWidth(),toggleBackgroundBitmap.getHeight()); } private void init() { paint = new Paint(); } @Override protected void onDraw(Canvas canvas) {
// 1、繪制背景
canvas.drawBitmap(toggleBackgroundBitmap,0,0,paint);
// 2、繪制滑塊
if(mSwitchState){
int newLeft = toggleBackgroundBitmap.getWidth() - slideButtonBitmap.getWidth();
canvas.drawBitmap(slideButtonBitmap,newLeft,0,paint);
}else {
canvas.drawBitmap(slideButtonBitmap,0,0,paint);
}
}
到這里只要改變setSwitchState運行程序,就可以顯示出自定義的滑動按鈕開關狀態了
本文只通過設置bool值改變滑動塊圖片位置。