国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義實現可滑動按鈕

2019-10-21 21:26:14
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android自定義實現可滑動按鈕的具體代碼,供大家參考,具體內容如下

實現邏輯

1.創建一個類繼承view類,實現里面的onMeasure() onDraw()方法

2.在 onMeasure() 中需要調用setMeasuredDimension(viewWidth,viewheight),用來繪制按鈕的位置區域

3.需要加載按鈕的背景和滑塊資源 并且轉化為bitmap對象

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

5.獲取滑塊的寬度,用來調整按鈕的開和關

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

7.創建一個觸摸事件,用來監聽按鈕所在的位置

8.創建drawSlide方法,用來限制滑塊的運行區間,防止滑塊劃出指定的區域,并限制按鈕只有兩個結果,開和關

9.根據drawSlide方法得到開關的結果,設置開關的狀態

10.根據開關的狀態設置開關中滑塊的位置

11設.置一個回調接口,用來監聽按鈕的狀態是否發生改變

布局文件

<?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);  //設置按鈕的狀態  toggleButton.setToggleStste(true);  //創建一個監聽  MyListener myListener = new MyListener();  //設置監聽  toggleButton.setOnToggleStateChangedListener(myListener);  //初始化控件  toggleButton2 = (MyToggleButton) findViewById(R.id.myToggle2);  //設置按鈕的狀態  toggleButton2.setToggleStste(true);  //創建一個監聽  MyListener myListener2 = new MyListener();  //設置監聽  toggleButton2.setOnToggleStateChangedListener(myListener2);}//創建一個監聽class MyListener implements MyToggleButton.onToggleStateChangedListener {  @Override  public void onToggleStateChange(MyToggleButton button, boolean isToggleOn) {    //判定是哪個按鈕觸發了監聽    switch (button.getId()) {      case R.id.myToggle:        Toast.makeText(MainActivity.this, isToggleOn ? "開1" : "關1", Toast.LENGTH_SHORT).show();        break;      case R.id.myToggle2:        Toast.makeText(MainActivity.this, isToggleOn ? "開2" : "關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;//設置一個成員變量,用來判定開關的狀態private boolean toggleStste = false;private boolean canChangeToggleState = false;private onToggleStateChangedListener monToggleStateChangedListener = null;//創建一個開關狀態改變的監聽,當狀態改變時觸發,否則不觸發public void setOnToggleStateChangedListener(onToggleStateChangedListener monToggleStateChangedListener) {  this.monToggleStateChangedListener = monToggleStateChangedListener;}public MyToggleButton(Context context, AttributeSet attrs) {  super(context, attrs);  //設置按鈕的背景和滑塊資源  setBackgroundAndSlideResource(R.mipmap.toogle_background, R.mipmap.toogle_slidebg);  //獲取背景的高度和寬度  viewWidth = bgBitmap.getWidth();  viewheight = bgBitmap.getHeight();  //背景的寬和高就是這個自定義按鈕的寬和高  //獲取滑塊的寬度  slideWidth = slidebg.getWidth();  //計算滑塊的右邊最大值  slideMaxLeft = viewWidth - slideWidth;}//定義一個方法,用來顯示按鈕是開還是關public void setToggleStste(boolean toggleStste) {  this.toggleStste = toggleStste;  if (toggleStste) {    slidebgleft = slideMaxLeft;  } else {    slidebgleft = 0;  }  //重新繪制  invalidate();}//設置按鈕的背景和滑塊資源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);  //調用setMeasuredDimension繪制按鈕的區域  setMeasuredDimension(viewWidth, viewheight);}@Overrideprotected void onDraw(Canvas canvas) {  //重寫drawBitmap,將控件的背景和滑塊繪制到頁面中  canvas.drawBitmap(bgBitmap, 0, 0, null);  drawSlide(canvas);}//通過控制slidebgleft,來控制滑塊的位置private void drawSlide(Canvas canvas) {  //限制滑塊的運行區間,防止滑塊移動到界外  if (slidebgleft < 0) {    slidebgleft = 0;  } else if (slidebgleft > slideMaxLeft) {    slidebgleft = slideMaxLeft;  }  canvas.drawBitmap(slidebg, slidebgleft, 0, null);  if (canChangeToggleState) {    canChangeToggleState = false;    //記錄上一次開關的狀態    boolean lastToggleState = toggleStste;    //根據當前滑塊的位置更新開關的狀態    if (slidebgleft == 0) {      toggleStste = false;    } else {      toggleStste = true;    }    //如果當前的狀態與上一次狀態不同時,才會觸發監聽事件    if (lastToggleState != toggleStste && monToggleStateChangedListener != null) {      monToggleStateChangedListener.onToggleStateChange(this, toggleStste);    }  }}//設置按鈕的觸摸事件@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;      }      //只有當手機離開屏幕的是否才可以觸發監聽      canChangeToggleState = true;      break;  }  //重復不斷地繪制  invalidate();  return true;}interface onToggleStateChangedListener {  void onToggleStateChange(MyToggleButton button, boolean isToggleOn);}}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博乐市| 饶阳县| 聂荣县| 名山县| 武隆县| 华阴市| 嘉禾县| 和政县| 周宁县| 静海县| 资阳市| 沙洋县| 梁河县| 大连市| 德惠市| 永昌县| 呼图壁县| 尼木县| 桐城市| 宁明县| 嵊州市| 峨山| 嘉峪关市| 大理市| 肃南| 蒲江县| 江都市| 射洪县| 墨江| 哈巴河县| 保亭| 永春县| 丰镇市| 宜君县| 瑞昌市| 汾阳市| 理塘县| 和林格尔县| 海安县| 清苑县| 德惠市|