麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(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è)類繼承view類,實(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)整按鈕的開和關(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é)果,開和關(guān)

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

10.根據(jù)開關(guān)的狀態(tài)設(shè)置開關(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 ? "開1" : "關(guān)1", Toast.LENGTH_SHORT).show();        break;      case R.id.myToggle2:        Toast.makeText(MainActivity.this, isToggleOn ? "開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)判定開關(guān)的狀態(tài)private boolean toggleStste = false;private boolean canChangeToggleState = false;private onToggleStateChangedListener monToggleStateChangedListener = null;//創(chuàng)建一個(gè)開關(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)顯示按鈕是開還是關(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) {  //重寫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;    //記錄上一次開關(guān)的狀態(tài)    boolean lastToggleState = toggleStste;    //根據(jù)當(dāng)前滑塊的位置更新開關(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ī)離開屏幕的是否才可以觸發(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開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 精品亚洲va在线va天堂资源站 | jizzzxxxxhd| xxx18hd18hd日本| 精品国产一区在线 | 草莓视频在线导航 | 国产免费高清在线视频 | 国产精品成人亚洲一区二区 | 成人羞羞视频在线观看 | 毛片在哪看 | 91短视频网页版 | 久久老司机 | 毛片视频观看 | 九九爱视频 | va视频| 羞羞答答视频 | 亚洲免费视频大全 | 久久久久亚洲国产精品 | 久久精品中文字幕一区二区三区 | 国产精品亚洲一区二区三区在线观看 | 久草干| 久久久久久免费 | www国产成人免费观看视频 | 国产精品资源手机在线播放 | 一级黄色在线免费观看 | 99精品在线视频观看 | 亚洲aⅴ免费在线观看 | 国产人成精品一区二区三 | 精品中文字幕久久久久四十五十骆 | 视频一区二区三区视频 | 91香蕉影视 | 天天躁狠狠躁夜躁2020挡不住 | 欧美日韩在线中文字幕 | 他也色在线视频 | 久久久久久久久日本理论电影 | 91久久国产露脸精品国产护士 | 中文字幕一区久久 | 日韩av在线网址 | 日本高清电影在线播放 | 涩涩激情网 | 国产chinesehd精品91 | 黄色小视频在线免费看 |