android(11) 滑動的開關按鈕

來源:互聯網
上載者:User

標籤:android

一.滑動的開關按鈕:

  找到好點的資源總是要分享,下面分享這個源碼(需要源碼留下郵箱),順便簡單說明一下幾個類。

(1).Rect類:


從大概可以看出Rect中四個參數的含義了吧,Rect中還有left,top,right,bottom這四個變數是什麼意思呢?

r.left(矩形左邊):通俗說的就是中A距離X軸的距離0;

r.top(矩形上邊):通俗說的就是中A距離Y軸的距離0;

r.right(矩形右邊):通俗說的就是中B距離Y軸的距離50;

r.bottom(矩形底邊):通俗說的就是中B距離Y軸的距離50;


(2).Paint類(畫筆):可以根據自己的需求畫出不同顏色和樣式的圖形和文字。

Paint類主要的方法有:

setAntiAlias:設定畫筆的鋸齒效果。

setColor:設定畫筆的顏色。

setARGB:設定畫筆的a,r,p,g值。

setAlpha:設定Alpha值。

setTextSize:設定紫的尺寸。

setStyle:設定畫筆的風格,空心或者實心。


(3).Bitmap類(位元影像):可用於擷取影像檔資訊,進行映像剪下、旋轉、縮放等操作,並可以指定影像檔儲存操作

getHeight():擷取位元影像寬度
getWidth():擷取位元影像高度
createBitmap(Bitmap src):通過位元影像資源建立位元影像執行個體
createBitmap(Bitmap source, int x, int y, int width, int height):在指定位置建立位元影像,可放大縮小位source是位元影像資源,(x,y)表示位元影像左上方座標,width表示位元影像寬度,height表示位元影像高度


(4).Canvas類(畫布):在畫布上繪製之外,還需要設定一些關於畫布的屬性,幾個常用方法:

Canvas():建立一個空的畫布。可以使用setBitmap()方法來設定繪製的具體畫布。

Canvas(Bitmap):以Bitmap對象建立一個畫布,則將內容都繪製在Bitmap上,因此Bitmap不能為null。

drawColor:設定Canvas的背景顏色。

clipRect:設定顯示地區。

rotate:旋轉畫布。


(5).Matrix類:進行映像的操作。

Translate:平移變換
Rotate:旋轉變換
Scale:縮放變換
Skew:錯切變換





主介面:

public class SlipButtonActivity extends Activity {private SlipButton sb = null;private Button btn = null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);initView();setListener();}private void setListener() {sb.SetOnChangedListener(new OnChangedListener() {public void OnChanged(boolean CheckState) {btn.setText(CheckState ? "開啟" : "關閉");}});}private void initView() {sb = (SlipButton) findViewById(R.id.splitbutton);btn = (Button) findViewById(R.id.ringagain);sb.setCheck(true);}}

布局:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="@drawable/blue_striped_bg"    android:orientation="vertical" >    <RelativeLayout        android:id="@+id/relativeLayout1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginTop="15dip"        android:padding="5dip" >        <Button            android:id="@+id/ringagain"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_centerHorizontal="true"            android:background="@drawable/clock_list"            android:clickable="false"            android:gravity="center_vertical"            android:padding="10dip"            android:text="開啟"            android:textColor="@android:color/black"            android:textSize="18sp" />        <com.cn.slipbutton.SlipButton            android:id="@+id/splitbutton"            android:layout_width="100dip"            android:layout_height="40dip"            android:layout_alignRight="@id/ringagain"            android:layout_alignTop="@id/ringagain"            android:layout_marginTop="10dip" />    </RelativeLayout></LinearLayout>

自訂view:

public class SlipButton extends View implements OnTouchListener {private boolean NowChoose = false;// 記錄當前按鈕是否開啟,true為開啟,flase為關閉private boolean isChecked;private boolean OnSlip = false;// 記錄使用者是否在滑動的變數private float DownX, NowX;// 按下時的x,當前的xprivate Rect Btn_On, Btn_Off;// 開啟和關閉狀態下,遊標的Rect .private boolean isChgLsnOn = false;private OnChangedListener ChgLsn;private Bitmap bg_on, bg_off, slip_btn;public SlipButton(Context context) {super(context);init();}public SlipButton(Context context, AttributeSet attrs) {super(context, attrs);init();}public SlipButton(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}private void init() {// 初始化bg_on = BitmapFactory.decodeResource(getResources(),R.drawable.split_left_1);bg_off = BitmapFactory.decodeResource(getResources(),R.drawable.split_right_1);slip_btn = BitmapFactory.decodeResource(getResources(),R.drawable.split_1);Btn_On = new Rect(0, 0, slip_btn.getWidth(), slip_btn.getHeight());Btn_Off = new Rect(bg_off.getWidth() - slip_btn.getWidth(), 0,bg_off.getWidth(), slip_btn.getHeight());setOnTouchListener(this);//設定監聽器,也可以直接複寫OnTouchEvent}@Overrideprotected void onDraw(Canvas canvas) {// 繪圖函數super.onDraw(canvas);        //對映像進行操作Matrix matrix = new Matrix();//畫筆Paint paint = new Paint();float x;if (NowX < (bg_on.getWidth() / 2))// 滑動到前半段與後半段的背景不同,在此做判斷{x = NowX - slip_btn.getWidth() / 2;canvas.drawBitmap(bg_off, matrix, paint);// 畫出關閉時的背景}else {x = bg_on.getWidth() - slip_btn.getWidth() / 2;canvas.drawBitmap(bg_on, matrix, paint);// 畫出開啟時的背景}if (OnSlip)// 是否是在滑動狀態,{if (NowX >= bg_on.getWidth())// 是否划出指定範圍,不能讓遊標跑到外頭,必須做這個判斷x = bg_on.getWidth() - slip_btn.getWidth() / 2;// 減去遊標1/2的長度...else if (NowX < 0) {x = 0;} else {x = NowX - slip_btn.getWidth() / 2;}} else {// 非滑動狀態if (NowChoose)// 根據現在的開關狀態設定畫遊標的位置{x = Btn_Off.left;canvas.drawBitmap(bg_on, matrix, paint);// 初始狀態為true時應該畫出開啟狀態圖片} else{x = Btn_On.left;}}if (isChecked) {canvas.drawBitmap(bg_on, matrix, paint);x = Btn_Off.left;isChecked = !isChecked;}if (x < 0)// 對遊標位置進行異常判斷...x = 0;else if (x > bg_on.getWidth() - slip_btn.getWidth())x = bg_on.getWidth() - slip_btn.getWidth();canvas.drawBitmap(slip_btn, x, 0, paint);// 畫出遊標.}    public boolean onTouch(View v, MotionEvent event) {// 根據動作來執行代碼switch (event.getAction()){case MotionEvent.ACTION_MOVE:// 滑動NowX = event.getX();break;case MotionEvent.ACTION_DOWN:// 按下if (event.getX() > bg_on.getWidth()|| event.getY() > bg_on.getHeight())return false;OnSlip = true;DownX = event.getX();NowX = DownX;break;case MotionEvent.ACTION_CANCEL: // 移到控制項外部OnSlip = false;boolean choose = NowChoose;if (NowX >= (bg_on.getWidth() / 2)) {NowX = bg_on.getWidth() - slip_btn.getWidth() / 2;NowChoose = true;} else {NowX = NowX - slip_btn.getWidth() / 2;NowChoose = false;}if (isChgLsnOn && (choose != NowChoose)) // 如果設定了監聽器,就調用其方法..ChgLsn.OnChanged(NowChoose);break;case MotionEvent.ACTION_UP:// 鬆開OnSlip = false;boolean LastChoose = NowChoose;if (event.getX() >= (bg_on.getWidth() / 2)) {NowX = bg_on.getWidth() - slip_btn.getWidth() / 2;NowChoose = true;}else {NowX = NowX - slip_btn.getWidth() / 2;NowChoose = false;}if (isChgLsnOn && (LastChoose != NowChoose)) // 如果設定了監聽器,就調用其方法..ChgLsn.OnChanged(NowChoose);break;default:}invalidate();// 重畫控制項return true;}public void SetOnChangedListener(OnChangedListener l) {// 設定監聽器,當狀態修改的時候isChgLsnOn = true;ChgLsn = l;}public interface OnChangedListener {abstract void OnChanged(boolean CheckState);}public void setCheck(boolean isChecked) {this.isChecked = isChecked;NowChoose = isChecked;}}





android(11) 滑動的開關按鈕

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.