欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義控件實(shí)現(xiàn)簡單滑動開關(guān)效果

 更新時(shí)間:2022年02月16日 16:22:46   作者:Jack-Chan  
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)簡單滑動開關(guān)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android自定義控件實(shí)現(xiàn)簡單滑動開關(guān)的具體代碼,供大家參考,具體內(nèi)容如下

ToggleButton 滑動開關(guān)

項(xiàng)目概述

滑動開關(guān)是一個(gè)純粹的自定義控件,上面的按鈕會隨著我們的左右滑動而滑動,并且在狀態(tài)改變時(shí)通知用戶,效果如下圖1-9 所示,這也是應(yīng)用中設(shè)置某些狀態(tài)信息時(shí)最常見的控件,因此,我們有必要學(xué)習(xí)關(guān)于如何

自定義一個(gè)這樣的滑動開關(guān)。

滑動開關(guān)UI

布局文件為activity_main.xml,代碼如下:res/layout/activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
? ? ? ? ? ? ? ? xmlns:itheima="http://schemas.android.com/apk/res/com.itheima.togglebuttondemo"
? ? ? ? ? ? ? ? xmlns:tools="http://schemas.android.com/tools"
? ? ? ? ? ? ? ? android:layout_width="match_parent"
? ? ? ? ? ? ? ? android:layout_height="match_parent">
? ? <com.itheima.togglebuttondemo.view.ToggleButton
? ? ? ? android:id="@+id/togglebutton"
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_centerInParent="true"
? ? ? ? itheima:SwitchBtnBackgroud="@drawable/switch_background"
? ? ? ? itheima:SlidBtnBackgroud="@drawable/slide_button_background"
? ? ? ? itheima:CurrentState="false"
? ? ? ? android:layout_height="wrap_content"/>
</RelativeLayout>

在activity_main.xml 布局中引入如下命名空間:

xmlns:itheima=”http://schemas.android.com/apk/res/com.itheima.togglebuttondemo”,com.itheima.togglebuttondemo 是包名,itheima 是自定義的命名控件名,可以任取名字,也可以使用類名。

上面的布局主要是引入com.itheima.togglebuttondemo.view.ToggleButton 類和自定義屬性的使用。添加自定義屬性,在values 目錄下創(chuàng)建attrs.xml 文件,具體代碼如文件所示:

res/values/attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

? ? <declare-styleable name="ToggleButton">
? ? ? ? <!-- 滑動開關(guān)背景圖片屬性-->
? ? ? ? <attr
? ? ? ? ? ? name="SwitchBtnBackgroud"
? ? ? ? ? ? format="reference"/>
? ? ? ? <!-- 滑動塊背景圖片屬性-->
? ? ? ? <attr
? ? ? ? ? ? name="SlidBtnBackgroud"
? ? ? ? ? ? format="reference"/>
? ? ? ? <!-- 滑動開關(guān)的狀態(tài)-->
? ? ? ? <attr
? ? ? ? ? ? name="CurrentState"
? ? ? ? ? ? format="boolean"/>
? ? </declare-styleable>
</resources>

attrs.xml 文件目錄結(jié)構(gòu)如下圖所示:

滑動開關(guān)業(yè)務(wù)邏輯實(shí)現(xiàn)

下拉選擇框activity 界面,MainActivity.java 代碼如下:com/itheima/MySwitch/MainActivity

public class MainActivity extends Activity {
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? ToggleButton togglebutton = (ToggleButton) findViewById(R.id.togglebutton);
? ? ? ? //設(shè)置滑動開關(guān)的背景圖片
? ? ? ? // togglebutton.setSwitchBtnBackgroudResource(R.drawable.switch_background);
? ? ? ? //設(shè)置滑動塊的背景圖片
? ? ? ? // togglebutton.setSlidBtnBackgroudResource(R.drawable.slide_button_background);
? ? ? ? //設(shè)置滑動開關(guān)的默認(rèn)狀態(tài)
? ? ? ? // togglebutton.setCurrentState(true);
? ? ? ? //設(shè)置滑動開關(guān)狀態(tài)改變監(jiān)聽
? ? ? ? Togglebutton.setToggleBtnStateChangeListener(new ToggleBtnStateChangeListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onToggleBtnStateChange(boolean currentState) {
? ? ? ? ? ? ? ? if (currentState) {
? ? ? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "開關(guān)打開", 0).show();
? ? ? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? ? ? Toast.makeText(getApplicationContext(), "開關(guān)關(guān)閉", 0).show();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? }
}

自定義的滑動開關(guān)ToggleButton 類的實(shí)現(xiàn),具體代碼如文件所示:com/itheima/MySwitch/MainActivity

public class ToggleButton extends View {
? ? private Bitmap ?switchBitmap;//滑動開關(guān)的背景圖片
? ? private Bitmap ?slidBitmap;//滑動塊的背景圖片
? ? private boolean currentState;
? ? private int ? ? currentX;//手指觸摸點(diǎn)的X 值
? ? private boolean isTouching = false;
? ? private ToggleBtnStateChangeListener mToggleBtnStateChangeListener;//狀態(tài)改變監(jiān)聽器
? ? //在xml 中引用該控件時(shí),調(diào)用該方法
? ? public ToggleButton(Context context, AttributeSet attrs) {
? ? ? ? super(context, attrs);
? ? ? ? String namespace = "http://schemas.android.com/apk/res/com.itheima.togglebuttondemo";
? ? ? ? currentState = attrs.getAttributeBooleanValue(namespace, "CurrentState", false);
? ? ? ? int switchBtnBackgroudId =
? ? ? ? ? ? ? ? attrs.getAttributeResourceValue(namespace, "SwitchBtnBackgroud", -1);
? ? ? ? int slidBtnBackgroudId =
? ? ? ? ? ? ? ? attrs.getAttributeResourceValue(namespace, "SlidBtnBackgroud", -1);
? ? ? ? setSwitchBtnBackgroudResource(switchBtnBackgroudId);
? ? ? ? setSlidBtnBackgroudResource(slidBtnBackgroudId);
? ? }
? ? //在代碼中創(chuàng)建該控件時(shí),調(diào)用該構(gòu)造方法
? ? public ToggleButton(Context context) {
? ? ? ? super(context);
? ? }
? ? //設(shè)置滑動開關(guān)的背景圖片
? ? public void setSwitchBtnBackgroudResource(int switchBackground) {
? ? ? ? switchBitmap = BitmapFactory.decodeResource(getResources(), switchBackground);
? ? }
? ? // 為了可以高度自定義和增強(qiáng)可擴(kuò)展性,我們可以給其創(chuàng)建一個(gè)自定義控件底部背景了一個(gè)方法
? ? // 設(shè)置滑動塊的背景圖片
? ? public void setSlidBtnBackgroudResource(int slideButtonBackground) {
? ? ? ? slidBitmap = BitmapFactory.decodeResource(getResources(), slideButtonBackground);
? ? }
? ? //設(shè)置滑動開關(guān)的默認(rèn)狀態(tài)
? ? public void setCurrentState(boolean b) {
? ? ? ? currentState = b;
? ? }
? ? // 1、測量滑動開關(guān)的寬高
? ? // 測量控件的寬高
? ? @Override
? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
? ? ? ? super.onMeasure(widthMeasureSpec, heightMeasureSpec);
? ? ? ? setMeasuredDimension(switchBitmap.getWidth(), switchBitmap.getHeight());
? ? }
? ? // 2、繪制,畫出我們的滑動開關(guān)
? ? //canvas:畫布,將圖形繪制在canvas,才能顯示到屏幕上
? ? @Override
? ? protected void onDraw(Canvas canvas) {
? ? ? ? //繪制滑動開關(guān)的背景圖片
? ? ? ? canvas.drawBitmap(switchBitmap, 0, 0, null);
? ? ? ? //繪制滑動塊的背景圖片
? ? ? ? if(isTouching){//手指觸摸的時(shí)候,根據(jù)currentx 的值來繪制滑動塊
? ? ? ? ? ? //根據(jù)手指的X 值,來繪制滑動塊圖片
? ? ? ? ? ? int left = currentX - slidBitmap.getWidth()/2;
? ? ? ? ? ? if(left < 0){//設(shè)置左邊界
? ? ? ? ? ? ? ? left = 0;
? ? ? ? ? ? }else if(left > (switchBitmap.getWidth() - slidBitmap.getWidth())){//設(shè)置右邊界
? ? ? ? ? ? ? ? left = switchBitmap.getWidth() - slidBitmap.getWidth();
? ? ? ? ? ? }
? ? ? ? ? ? canvas.drawBitmap(slidBitmap, left, 0, null);
? ? ? ? }else{ // 手指離開控件的時(shí)候,根據(jù)狀態(tài)來繪制滑動塊
? ? ? ? ? ? // 根據(jù)狀態(tài)值,來繪制滑動塊
? ? ? ? ? ? if(currentState){ //當(dāng)前為true,開關(guān)打開,滑動塊顯示在最右邊
? ? ? ? ? ? ? ? canvas.drawBitmap(slidBitmap,switchBitmap.getWidth() - slidBitmap.getWidth(),
? ? ? ? ? ? ? ? ? ? ? ? 0, null);
? ? ? ? ? ? }else{//當(dāng)前為false,開關(guān)關(guān)閉,滑動塊顯示在最左邊
? ? ? ? ? ? ? ? canvas.drawBitmap(slidBitmap, 0, 0, null);
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? //當(dāng)控件被觸摸后,會調(diào)用該方法
? ? @Override
? ? public boolean onTouchEvent(MotionEvent event) {
? ? ? ? switch (event.getAction()) {
? ? ? ? ? ? case MotionEvent.ACTION_DOWN://手指按下
? ? ? ? ? ? ? ? isTouching = true;
? ? ? ? ? ? ? ? currentX = (int) event.getX();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case MotionEvent.ACTION_MOVE://手指滑動
? ? ? ? ? ? ? ? isTouching= true;
? ? ? ? ? ? ? ? currentX = (int) event.getX();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case MotionEvent.ACTION_UP://手指抬起
? ? ? ? ? ? ? ? isTouching = false;
? ? ? ? ? ? ? ? currentX = (int) event.getX();
? ? ? ? ? ? ? ? int center = switchBitmap.getWidth()/2;
? ? ? ? ? ? ? ? //當(dāng)滑動塊中心點(diǎn)大于滑動開關(guān)背景圖片的中心線時(shí),顯示到右邊,當(dāng)前狀態(tài)為true
? ? ? ? ? ? ? ? boolean state = currentState;
? ? ? ? ? ? ? ? currentState = currentX > center;
? ? ? ? ? ? ? ? if(mToggleBtnStateChangeListener !=null&&state != currentState ){
? ? ? ? ? ? ? ? ? ? mToggleBtnStateChangeListener.onToggleBtnStateChange(currentState);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? break;
? ? ? ? }
? ? ? ? invalidate(); //強(qiáng)制讓控件重新繪制,ondraw;
? ? ? ? return true; //自己處理觸摸事件
? ? }
? ? public void setToggleBtnStateChangeListener(ToggleBtnStateChangeListenerlistener){
? ? ? ? this.mToggleBtnStateChangeListener = listener;
? ? }
? ? // 定義滑動開關(guān)狀態(tài)改變的回調(diào)接口
? ? public interface ToggleBtnStateChangeListener{
? ? ? ? void onToggleBtnStateChange(boolean currentState);
? ? }
}

運(yùn)行程序,效果圖如圖1-11 所示。

知識點(diǎn)總結(jié)

1.通過setMeasuredDimension 方法,來設(shè)置自定義控件的寬高,見ToggleButton 類第42 行
2.View 可以通過invalidate()方法強(qiáng)制讓自己重新繪制,見ToggleButton 類第96 行
3.View 通過實(shí)現(xiàn)onTouchEvent 方法來處理手指觸摸事件,見ToggleButton 類第72 行

自定義控件之自定義屬性

當(dāng)我們使用自定義屬性來自定義控件時(shí),一般分為以下幾個(gè)步驟進(jìn)行設(shè)置:

1、在res 文件的values 里面創(chuàng)建attrs.xml,見文件【1-10】attrs.xml
2、在attrs.xml,里面定義我們需要的屬性,見文件【1-10】attrs.xml 代碼
3、在布局文件中使用自定義的屬性,注意要添加命名空間,見文件【1-9】activity_main.xml 第2 行
4、在構(gòu)造方法中來獲取設(shè)置的屬性數(shù)據(jù),見文件【1-9】見ToggleButton 類第8~19 行

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android實(shí)現(xiàn)自定義圓形進(jìn)度條

    Android實(shí)現(xiàn)自定義圓形進(jìn)度條

    這篇文章主要介紹了Android自定義圓形進(jìn)度條實(shí)現(xiàn)代碼,進(jìn)度條在Android中教程經(jīng)常使用到,本文向大家分享了Android實(shí)現(xiàn)自定義圓形進(jìn)度條的代碼,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Android簡單實(shí)現(xiàn) 緩存數(shù)據(jù)

    Android簡單實(shí)現(xiàn) 緩存數(shù)據(jù)

    這篇文章主要介紹了Android簡單實(shí)現(xiàn) 緩存數(shù)據(jù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Android使用ftp方式實(shí)現(xiàn)文件上傳和下載功能

    Android使用ftp方式實(shí)現(xiàn)文件上傳和下載功能

    這篇文章主要介紹了Android使用ftp方式實(shí)現(xiàn)文件上傳和下載功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • RecyclerView進(jìn)階:使用ItemTouchHelper實(shí)現(xiàn)拖拽和側(cè)滑刪除效果

    RecyclerView進(jìn)階:使用ItemTouchHelper實(shí)現(xiàn)拖拽和側(cè)滑刪除效果

    現(xiàn)在RecyclerView的應(yīng)用越來越廣泛了,本篇文章主要介紹了RecyclerView進(jìn)階:使用ItemTouchHelper實(shí)現(xiàn)拖拽和側(cè)滑刪除效果,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-02-02
  • Android隨機(jī)生成驗(yàn)證碼

    Android隨機(jī)生成驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了Android隨機(jī)生成驗(yàn)證碼的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 基于Android MarginLeft與MarginStart的區(qū)別(詳解)

    基于Android MarginLeft與MarginStart的區(qū)別(詳解)

    下面小編就為大家分享一篇基于Android MarginLeft與MarginStart的區(qū)別(詳解),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Android view隨觸碰滑動效果

    Android view隨觸碰滑動效果

    Android view隨觸碰滑動效果,主要是通過ontouch方法獲取滑動到的位置和點(diǎn)擊下的位置,再去設(shè)置view的位置,具體實(shí)現(xiàn)代碼大家參考下本文吧
    2017-08-08
  • android 為應(yīng)用程序創(chuàng)建桌面快捷方式技巧分享

    android 為應(yīng)用程序創(chuàng)建桌面快捷方式技巧分享

    手機(jī)裝的軟件過多,找起來很不方便,所以在主頁面有一個(gè)快捷方式的話會很不錯(cuò)的,本文將介紹如何實(shí)現(xiàn),需要了解跟多的朋友可以參考下
    2012-12-12
  • Android中選項(xiàng)菜單(OptionMenu)的創(chuàng)建方法

    Android中選項(xiàng)菜單(OptionMenu)的創(chuàng)建方法

    這篇文章主要介紹了Android中選項(xiàng)菜單(OptionMenu)的創(chuàng)建方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • 淺談Flutter 中漸變的高級用法(3種)

    淺談Flutter 中漸變的高級用法(3種)

    這篇文章主要介紹了淺談Flutter 中漸變的高級用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07

最新評論