a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁(yè) > 系統(tǒng) > Android > 正文

Android自定義實(shí)現(xiàn)可滑動(dòng)按鈕

2019-10-21 21:26:14
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

本文實(shí)例為大家分享了Android自定義實(shí)現(xiàn)可滑動(dòng)按鈕的具體代碼,供大家參考,具體內(nèi)容如下

實(shí)現(xiàn)邏輯

1.創(chuàng)建一個(gè)類(lèi)繼承view類(lèi),實(shí)現(xiàn)里面的onMeasure() onDraw()方法

2.在 onMeasure() 中需要調(diào)用setMeasuredDimension(viewWidth,viewheight),用來(lái)繪制按鈕的位置區(qū)域

3.需要加載按鈕的背景和滑塊資源 并且轉(zhuǎn)化為bitmap對(duì)象

4.獲取背景圖片的寬和高作為自定義控件的寬和高

5.獲取滑塊的寬度,用來(lái)調(diào)整按鈕的開(kāi)和關(guān)

6.在onDraw()方法中繪制出背景圖片和滑塊,并展示在頁(yè)面中

7.創(chuàng)建一個(gè)觸摸事件,用來(lái)監(jiān)聽(tīng)按鈕所在的位置

8.創(chuàng)建drawSlide方法,用來(lái)限制滑塊的運(yùn)行區(qū)間,防止滑塊劃出指定的區(qū)域,并限制按鈕只有兩個(gè)結(jié)果,開(kāi)和關(guān)

9.根據(jù)drawSlide方法得到開(kāi)關(guān)的結(jié)果,設(shè)置開(kāi)關(guān)的狀態(tài)

10.根據(jù)開(kāi)關(guān)的狀態(tài)設(shè)置開(kāi)關(guān)中滑塊的位置

11設(shè).置一個(gè)回調(diào)接口,用來(lái)監(jiān)聽(tīng)按鈕的狀態(tài)是否發(fā)生改變

布局文件

<?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:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical"tools:context="com.example.a3_.MainActivity"><com.example.a3_.MyToggleButton  android:id="@+id/myToggle"  android:layout_width="wrap_content"  android:layout_height="wrap_content" /><com.example.a3_.MyToggleButton  android:id="@+id/myToggle2"  android:layout_width="wrap_content"  android:layout_height="wrap_content" /></LinearLayout>

核心代碼

package com.example.a3_;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends AppCompatActivity {private MyToggleButton toggleButton;private MyToggleButton toggleButton2;@Overrideprotected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  //初始化控件  toggleButton = (MyToggleButton) findViewById(R.id.myToggle);  //設(shè)置按鈕的狀態(tài)  toggleButton.setToggleStste(true);  //創(chuàng)建一個(gè)監(jiān)聽(tīng)  MyListener myListener = new MyListener();  //設(shè)置監(jiān)聽(tīng)  toggleButton.setOnToggleStateChangedListener(myListener);  //初始化控件  toggleButton2 = (MyToggleButton) findViewById(R.id.myToggle2);  //設(shè)置按鈕的狀態(tài)  toggleButton2.setToggleStste(true);  //創(chuàng)建一個(gè)監(jiān)聽(tīng)  MyListener myListener2 = new MyListener();  //設(shè)置監(jiān)聽(tīng)  toggleButton2.setOnToggleStateChangedListener(myListener2);}//創(chuàng)建一個(gè)監(jiān)聽(tīng)class MyListener implements MyToggleButton.onToggleStateChangedListener {  @Override  public void onToggleStateChange(MyToggleButton button, boolean isToggleOn) {    //判定是哪個(gè)按鈕觸發(fā)了監(jiān)聽(tīng)    switch (button.getId()) {      case R.id.myToggle:        Toast.makeText(MainActivity.this, isToggleOn ? "開(kāi)1" : "關(guān)1", Toast.LENGTH_SHORT).show();        break;      case R.id.myToggle2:        Toast.makeText(MainActivity.this, isToggleOn ? "開(kāi)2" : "關(guān)2", Toast.LENGTH_SHORT).show();    }  }}}

自定義控件代碼

package com.example.a3_;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * Created by Administrator on 2017.05.27.0027. */public class MyToggleButton extends View {private Bitmap bgBitmap;private Bitmap slidebg;private final int viewWidth;private final int viewheight;private float slidebgleft;private final int slideWidth;private final int slideMaxLeft;//設(shè)置一個(gè)成員變量,用來(lái)判定開(kāi)關(guān)的狀態(tài)private boolean toggleStste = false;private boolean canChangeToggleState = false;private onToggleStateChangedListener monToggleStateChangedListener = null;//創(chuàng)建一個(gè)開(kāi)關(guān)狀態(tài)改變的監(jiān)聽(tīng),當(dāng)狀態(tài)改變時(shí)觸發(fā),否則不觸發(fā)public void setOnToggleStateChangedListener(onToggleStateChangedListener monToggleStateChangedListener) {  this.monToggleStateChangedListener = monToggleStateChangedListener;}public MyToggleButton(Context context, AttributeSet attrs) {  super(context, attrs);  //設(shè)置按鈕的背景和滑塊資源  setBackgroundAndSlideResource(R.mipmap.toogle_background, R.mipmap.toogle_slidebg);  //獲取背景的高度和寬度  viewWidth = bgBitmap.getWidth();  viewheight = bgBitmap.getHeight();  //背景的寬和高就是這個(gè)自定義按鈕的寬和高  //獲取滑塊的寬度  slideWidth = slidebg.getWidth();  //計(jì)算滑塊的右邊最大值  slideMaxLeft = viewWidth - slideWidth;}//定義一個(gè)方法,用來(lái)顯示按鈕是開(kāi)還是關(guān)public void setToggleStste(boolean toggleStste) {  this.toggleStste = toggleStste;  if (toggleStste) {    slidebgleft = slideMaxLeft;  } else {    slidebgleft = 0;  }  //重新繪制  invalidate();}//設(shè)置按鈕的背景和滑塊資源private void setBackgroundAndSlideResource(int toogle_background, int toogle_slidebg) {  bgBitmap = BitmapFactory.decodeResource(getResources(), toogle_background);  slidebg = BitmapFactory.decodeResource(getResources(), toogle_slidebg);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//    super.onMeasure(widthMeasureSpec, heightMeasureSpec);  //調(diào)用setMeasuredDimension繪制按鈕的區(qū)域  setMeasuredDimension(viewWidth, viewheight);}@Overrideprotected void onDraw(Canvas canvas) {  //重寫(xiě)drawBitmap,將控件的背景和滑塊繪制到頁(yè)面中  canvas.drawBitmap(bgBitmap, 0, 0, null);  drawSlide(canvas);}//通過(guò)控制slidebgleft,來(lái)控制滑塊的位置private void drawSlide(Canvas canvas) {  //限制滑塊的運(yùn)行區(qū)間,防止滑塊移動(dòng)到界外  if (slidebgleft < 0) {    slidebgleft = 0;  } else if (slidebgleft > slideMaxLeft) {    slidebgleft = slideMaxLeft;  }  canvas.drawBitmap(slidebg, slidebgleft, 0, null);  if (canChangeToggleState) {    canChangeToggleState = false;    //記錄上一次開(kāi)關(guān)的狀態(tài)    boolean lastToggleState = toggleStste;    //根據(jù)當(dāng)前滑塊的位置更新開(kāi)關(guān)的狀態(tài)    if (slidebgleft == 0) {      toggleStste = false;    } else {      toggleStste = true;    }    //如果當(dāng)前的狀態(tài)與上一次狀態(tài)不同時(shí),才會(huì)觸發(fā)監(jiān)聽(tīng)事件    if (lastToggleState != toggleStste && monToggleStateChangedListener != null) {      monToggleStateChangedListener.onToggleStateChange(this, toggleStste);    }  }}//設(shè)置按鈕的觸摸事件@Overridepublic boolean onTouchEvent(MotionEvent event) {  switch (event.getAction()) {    case MotionEvent.ACTION_DOWN:      slidebgleft = event.getX() - slideWidth / 2;      break;    case MotionEvent.ACTION_MOVE:      slidebgleft = event.getX() - slideWidth / 2;      break;    case MotionEvent.ACTION_UP:      if (event.getX() > viewWidth / 2) {        slidebgleft = slideMaxLeft;      } else {        slidebgleft = 0;      }      //只有當(dāng)手機(jī)離開(kāi)屏幕的是否才可以觸發(fā)監(jiān)聽(tīng)      canChangeToggleState = true;      break;  }  //重復(fù)不斷地繪制  invalidate();  return true;}interface onToggleStateChangedListener {  void onToggleStateChange(MyToggleButton button, boolean isToggleOn);}}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 日韩国产欧美精品 | 欧美日韩中文在线观看 | 一区二区免费视频观看 | 日批免费在线观看 | 蜜桃av中文字幕 | 国产精品久久久99 | 久久久成| 欧美一区二区三区视频 | 国产欧美精品一区二区三区 | 动漫精品一区二区三区 | 91精品国产色综合久久 | 中文字幕一区二区三区乱码图片 | 亚洲欧洲一区二区 | 91久久久久 | 国产精品日日夜夜 | 中文字幕天天操 | 一级久久久 | 九九99久久| 日本亚洲国产一区二区三区 | 国产亚洲精品久久久久动 | 国产成人精品高清久久 | 亚洲电影一区二区 | 国产特级毛片 | 久久草视频 | 久久国产精品免费一区二区三区 | 亚洲精品一区二三区不卡 | 十环传奇在线观看完整免费高清 | 欧美精品一区二区在线播放 | 亚洲 中文 欧美 日韩 在线观看 | 91精品国产91久久久久久密臀 | 欧美一区二区三区四区视频 | 少妇一区二区三区毛片免费下载看 | 久久久久国产视频 | 超碰97免费在线 | 国产日韩一区二区 | 欧美专区在线 | 又爽又大又黄a级毛片在线视频 | 国产suv精品一区二区33 | 日韩一区中文字幕 | 欧美成人一区二区三区 | 欧洲美女7788成人免费视频 |