自定義控制項——開關按鈕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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...