本文實現全自定義控制項--自定義開關 本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,轉載請註明源地址。 自定義開關 (View),本文完成下麵內容 1. 寫個類繼承View2. 拷貝包含包名的全路徑到xml中3. 界面中找到該控制項, 設置初始信 ...
本文實現全自定義控制項--自定義開關
本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,轉載請註明源地址。
自定義開關 (View),本文完成下麵內容
1. 寫個類繼承View
2. 拷貝包含包名的全路徑到xml中
3. 界面中找到該控制項, 設置初始信息
4. 根據需求繪製界面內容
Android 的界面繪製流程:
測量----------> 擺放 -------->繪製
measure ----->layout ---->draw
| | |
onMeasure--->OnLayout-->onDraw
新建類ToggleView,繼承自View
package com.wuyudong.toggleview.ui; import android.content.Context; import android.util.AttributeSet; import android.view.View; /** * 自定義開關 * * @author wuyudong * */ public class ToggleView extends View { /** * 用於代碼創建控制項 * * @param context */ public ToggleView(Context context) { super(context); // TODO Auto-generated constructor stub } /** * 用於在xml里使用,可指定自定義屬性 * * @param context * @param attrs */ public ToggleView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } /** * 用於在xml里使用,可指定自定義屬性,如果指定了樣式,則走此構造函數 * * @param context * @param attrs * @param defStyle */ public ToggleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } /** * 設置背景圖 * * @param switchBackground */ public void setSwitchBackgroundResource(int switchBackground) { } /** * 設置滑塊圖片資源 * * @param slideButton */ public void setSlideButtonResource(int slideButton) { } /** * 設置開關狀態 * * @param b */ public void setSwitchState(boolean b) { } }
佈局如下:
<RelativeLayout 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=".MainActivity" > <com.wuyudong.toggleview.ui.ToggleView android:id="@+id/toggleView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout>
接著將畫布進行填充,設置開關狀態
package com.wuyudong.toggleview.ui; import com.wuyudong.toggleview.R; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; /** * 自定義開關 * * @author wuyudong * */ public class ToggleView extends View { private Bitmap switchBackgroundBitmap; private Bitmap slideButtonBitmap; private boolean mSwitchState = false; //開關狀態,預設關閉 /** * 用於代碼創建控制項 * * @param context */ public ToggleView(Context context) { super(context); // TODO Auto-generated constructor stub } /** * 用於在xml里使用,可指定自定義屬性 * * @param context * @param attrs */ public ToggleView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } /** * 用於在xml里使用,可指定自定義屬性,如果指定了樣式,則走此構造函數 * * @param context * @param attrs * @param defStyle */ public ToggleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(switchBackgroundBitmap.getWidth(), switchBackgroundBitmap.getHeight()); } /** * Canvas: 畫布,畫板,在上面繪製的內容都會顯示在界面上 */ @Override protected void onDraw(Canvas canvas) {//1、繪製背景 Paint paint = new Paint(); canvas.drawBitmap(switchBackgroundBitmap, 0, 0, paint); //2、繪製滑塊 //根據開關狀態,直接設置圖片位置 if(mSwitchState) { int newLeft = switchBackgroundBitmap.getWidth() - slideButtonBitmap.getWidth(); canvas.drawBitmap(slideButtonBitmap, newLeft, 0, paint); } else { canvas.drawBitmap(slideButtonBitmap, 0, 0, paint); } } /** * 設置背景圖 * * @param switchBackground */ public void setSwitchBackgroundResource(int switchBackground) { switchBackgroundBitmap = BitmapFactory.decodeResource(getResources(), switchBackground); } /** * 設置滑塊圖片資源 * * @param slideButton */ public void setSlideButtonResource(int slideButton) { slideButtonBitmap = BitmapFactory.decodeResource(getResources(), slideButton); } /** * 設置開關狀態 * * @param b */ public void setSwitchState(boolean mSwitchState) { this.mSwitchState = mSwitchState; } }