自定義控制項——開關按鈕ToggleButton

来源:http://www.cnblogs.com/dhr125/archive/2016/10/09/5942903.html
-Advertisement-
Play Games

實現一個類似於ToggleButton的開關按鈕 效果圖: 資源圖片: 1.自定義控制項類 2.xml中引用 以上,將Demo運行到模擬器上即可。 圖解: ...


  實現一個類似於ToggleButton的開關按鈕

  效果圖:

  

  資源圖片:

  

  1.自定義控制項類

  

  1 package com.dc.customview.view;
  2 
  3 import com.dc.customview.R;
  4 
  5 import android.content.Context;
  6 import android.graphics.Bitmap;
  7 import android.graphics.BitmapFactory;
  8 import android.graphics.Canvas;
  9 import android.util.AttributeSet;
 10 import android.view.MotionEvent;
 11 import android.view.View;
 12 
 13 public class CustomToggleButton extends View {
 14     private boolean state;//開關狀態,預設false,關
 15     private boolean isTounching;//是否觸摸狀態
 16     private int currentX;
 17     private Bitmap backBitmap;
 18     private Bitmap overBitmap;
 19     
 20     /**
 21      * 有style文件時調用
 22      * @param context
 23      * @param attrs
 24      * @param defStyle
 25      */
 26     public CustomToggleButton(Context context, AttributeSet attrs, int defStyle) {
 27         super(context, attrs, defStyle);
 28     }
 29 
 30     /**
 31      * xml中調用
 32      * @param context
 33      * @param attrs
 34      */
 35     public CustomToggleButton(Context context, AttributeSet attrs) {
 36         super(context, attrs);
 37     }
 38     /**
 39      * java代碼中調用
 40      * @param context
 41      */
 42     public CustomToggleButton(Context context) {
 43         super(context);
 44     }
 45     
 46     /**
 47      * 設置開關狀態
 48      * @param value
 49      */
 50     public void setState(boolean value){
 51         this.state = value;
 52     }
 53     /**
 54      * 獲取開關狀態
 55      * @param value
 56      * @return
 57      */
 58     public boolean getState(boolean value){
 59         return state;
 60     }
 61     
 62     /**
 63      * 先拿到自定義控制項需要的兩張圖片,並且設置自定義控制項的寬高
 64      * 如果不設置,則這個自定義控制項可以接收到全屏的觸摸事件,即相當於這個自定義控制項占了全屏
 65      * @param widthMeasureSpec
 66      * @param heightMeasureSpec
 67      */
 68     @Override
 69     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 70         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 71         //底層圖片
 72         backBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);
 73         //上層圖片
 74         overBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button_background);
 75 
 76         //寬高 和 底層圖片一樣
 77         setMeasuredDimension(backBitmap.getWidth(), backBitmap.getHeight());
 78     }
 79     
 80     /**
 81      * 繪製開關
 82      * @param canvas
 83      */
 84     @Override
 85     protected void onDraw(Canvas canvas) {
 86         super.onDraw(canvas);
 87         //1.繪製底層圖片
 88         canvas.drawBitmap(backBitmap, 0, 0, null);
 89         
 90         //2.繪製上層圖片
 91         if(isTounching){//上層圖片跟隨滑動
 92             
 93             /*
 94              * 防止上層圖片滑動出下層圖片的範圍
 95              */
 96             //算出當前觸摸點為上層圖片的中心點時,上層圖片的左側坐標距離
 97             int left  = currentX-overBitmap.getWidth()/2;
 98             
 99             if(left<0){//防止左側出界
100                 left = 0;
101             }else if(left > backBitmap.getWidth() - overBitmap.getWidth()){//防止右側出界
102                 left = backBitmap.getWidth() - overBitmap.getWidth();
103             }
104             canvas.drawBitmap(overBitmap, left, 0, null);
105             
106         }else{//上層圖片直接跳到開或關的位置
107             if(state){
108                 //
109                 canvas.drawBitmap(overBitmap, backBitmap.getWidth()-overBitmap.getWidth(), 0, null);
110             }else{
111                 //
112                 canvas.drawBitmap(overBitmap, 0, 0, null);
113             }
114         }
115         
116     }
117     /**
118      * 觸摸滑動開關
119      * @param event
120      * @return
121      */
122     @Override
123     public boolean onTouchEvent(MotionEvent event) {
124         switch (event.getAction()) {
125         case MotionEvent.ACTION_DOWN:
126             //按下時,觸摸狀態為true
127             isTounching = true;
128             //當前觸摸點的x坐標
129             currentX = (int) event.getX();
130             break;
131         case MotionEvent.ACTION_MOVE:
132             isTounching = true;
133             currentX = (int) event.getX();
134             break;
135         case MotionEvent.ACTION_UP:
136             //抬起時觸摸狀態為false
137             isTounching = false;
138             currentX = (int) event.getX();
139             break;
140         }
141         
142         //觸摸點超過底層圖片的一半,則state為true,開的狀態
143         state = currentX > backBitmap.getWidth()/2;
144         //重新繪製
145         invalidate();
146         return true;//自己處理觸摸事件
147     }
148     
149     
150 
151 }

  2.xml中引用

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10     <!-- 自定義控制項類的全類名 -->
11     <com.dc.customview.view.CustomToggleButton
12         android:layout_width="wrap_content"
13         android:layout_height="wrap_content"
14         android:layout_centerInParent="true">
15         
16     </com.dc.customview.view.CustomToggleButton>
17 
18 </RelativeLayout>

  以上,將Demo運行到模擬器上即可。

  圖解:

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SDK接入(1)之Android Facebook SDK接入 由於游戲已上線,且處於維護階段,所以有空寫寫各種SDK接入過程和遇到的問題,也當作一種工作總結。SDK接入主流分為這麼幾類, 、`支付 分享 推送 統計`等,達到借‘他山之石’的效果。順便吐槽下,現在國內是個渠道就弄個所謂的自己的SDK ...
  • 原理是拉伸裡面的內容,將邊保護起來 方法1: ①[image resizableImageWithCapInsets:UIEdgeInsetsMake(30, 30, 30, 30)]; ②[image resizableImageWithCapInsets:UIEdgeInsetsMake(30, ...
  • 在新的mac下check代碼後,執行創建ios工程的sh腳本,在終端提示 ios version not found 提示: 沿著提示發現,前面的是列印錯誤的,後面的才是出錯的問題,iphone.cmake內部錯誤地方如下圖 在執行命令的時候找不到ios sdk version 註意:後面的9.1 ...
  • 本文地址:http://www.cnblogs.com/wuyudong/p/5943005.html,轉載請註明出處。 本文實現導航界面1的佈局的實現,效果如下圖所示: 首先分析所使用的佈局樣式: 對應的activity_setup1.xml佈局文件內容如下: 最後還剩下右下角的佈局還沒有實現,將 ...
  • Android Apktool源碼編譯 標簽(空格分隔): Android Apktool 源碼編譯 需求 習慣NetBeans調試smali需要用Apktool反編譯apk,需要用 d的參數才能生成.java文件。下載最新的Apktool.jar,運行後提示smalidebugging已經從Apk ...
  • GCD定時器 圖片上繪製文字 查找一個視圖的所有子視圖 計算文件大小 UIView的設置部分圓角 計算字元串字元長度,一個漢字算兩個字元 防止滾動視圖手勢覆蓋側滑手勢 去掉導航欄返回的標題 字元串中是否含有中文 dispatch_group的使用 UITextField每四位加一個空格,實現代理 獲 ...
  • 最近提交審核不通過,再iOS10上運行崩潰 。然後需要處理崩潰的問題,晚上找了一下,整理收集起來。 方便後續查看使用。 參考: http://blog.csdn.net/gbking/article/details/52587149 http://www.cnblogs.com/xiaoc1314/ ...
  • 轉載請標明出處: http://www.cnblogs.com/zhaoyanjun/p/5942616.html 出自[趙彥軍博客] 2016/10/09 前言:以前寫過一篇 Android studio 使用Gradle發佈Android開源項目到JCenter 總結 ,這篇文章主要介紹如何把項 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...