1. 程式人生 > >Android View 仿iOS SwitchButton和各種效果集合

Android View 仿iOS SwitchButton和各種效果集合

自學android差不多有一年了,從最初的小白菜鳥,摸爬滾打,看大神們的部落格,android官網的api,某網站的視訊教學,github開源專案。奮鬥這麼久隱隱感覺自己可以脫離新手的身份了,交出這篇文章權當作andriod小學水準的畢業典禮。

iOS SwitchButton。  說實話功能也不過就個開關功能而已。但是為什麼讓人感覺不錯,因為效果看起來賞心悅目呀:

~~~~~~~~~~~~~~~~~


好了,為了實現它,首先要分析它。

這個按鈕被我玩來玩去最後靜止的時候都會停留在下面的樣子:

 

那麼怎麼把這個實現出來呢?觀察一番會發現上圖是極其規律的,只是一些基礎幾何圖形的組合。所以具備純程式碼實現可能性,同時如果用圖片實現這個效果需要對應的png檔案輔助,相信大家一定覺得麻煩。

那麼就把它畫出來!如何畫出來的分析路線:

1. 位置固定不變的背景,像田徑場一樣的形狀。

2. 圓圓的按鈕,壓在“田徑場”上面。  【之後背景全稱作"田徑場",比較形象,不服solo 囧】

3. 淡淡的按鈕陰影,夾在他們之間。

ps:哎,我還是分析的那麼透徹,贊一個。

開始動手!新建

  1. public class SwitchView extends View {  
  2.     public SwitchView(Context context) {  
  3.         this(context, null);  
  4.     }  
  5.     public SwitchView(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.         setLayerType(LAYER_TYPE_SOFTWARE, null);  
  8.     }  
  9. }  
  1. public class SwitchView extends View {  
  2.     public SwitchView(Context context) {  
  3.         this(context, null);  
  4.     }  
  5.     public SwitchView(Context context, AttributeSet attrs) {  
  6.         super(context, attrs);  
  7.         setLayerType(LAYER_TYPE_SOFTWARE, null);  
  8.     }  
  9. }  

之後為自己確定大小~  截圖量了一下 算上陰影寬高比例是 149:92 。即 height = width * 0.65 左右
  1. @Overrideprotectedvoid onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  2.     int widthSize = MeasureSpec.getSize(widthMeasureSpec);  
  3.     int heightSize = (int) (widthSize * 0.65f);  
  4.     setMeasuredDimension(widthSize, heightSize);  
  5. }  
  1. @Overrideprotectedvoid onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  2.     int widthSize = MeasureSpec.getSize(widthMeasureSpec);  
  3.     int heightSize = (int) (widthSize * 0.65f);  
  4.     setMeasuredDimension(widthSize, heightSize);  
  5. }  
繪製~
  1. @Overrideprotectedvoid onDraw(Canvas canvas) {  
  2.     super.onDraw(canvas);  
  3.     canvas.drawColor(0xffcccccc);  
  4. }  
  1. @Overrideprotectedvoid onDraw(Canvas canvas) {  
  2.     super.onDraw(canvas);  
  3.     canvas.drawColor(0xffcccccc);  
  4. }  
好噠,通向勝利的第一步已經完成了。


ps: 如果我說,剩下的大家自己思考,你們不會打我吧。

第二步,畫田徑場!

  1. privatefinal Paint paint = new Paint();  
  2. privatefinal Path sPath = new Path();  
  3. privateint mWidth, mHeight;  
  4. privatefloat sWidth, sHeight;  
  5. privatefloat sLeft, sTop, sRight, sBottom;  
  6. privatefloat sCenterX, sCenterY;  
  7. @Overrideprotectedvoid onSizeChanged(int w, int h, int oldw, int oldh) {  
  8.     super.onSizeChanged(w, h, oldw, oldh);  
  9.     mWidth = w; // 檢視自身寬度
  10.     mHeight = h; // 檢視自身高度
  11.     sLeft = sTop = 0// 田徑場 左和上的座標
  12.     sRight = mWidth; // 田徑場 右佔自身的全部
  13.     sBottom = mHeight * 0.8f; // 田徑場底部 佔全身的百分之八十, 下面預留百分之二十的空間畫按鈕陰影。
  14.     sWidth = sRight - sLeft; // 田徑場的寬度
  15.     sHeight = sBottom - sTop; // 田徑場的高度
  16.     sCenterX = (sRight + sLeft) / 2// 田徑場的X軸中心座標
  17.     sCenterY = (sBottom + sTop) / 2// 田徑場的Y軸中心座標
  18.     RectF sRectF = new RectF(sLeft, sTop, sBottom, sBottom);  
  19.     sPath.arcTo(sRectF, 90180);  
  20.     sRectF.left = sRight - sBottom;  
  21.     sRectF.right = sRight;  
  22.     sPath.arcTo(sRectF, 270180);  
  23.     sPath.close();    // path準備田徑場的路徑
  24. }  
  25. @Overrideprotectedvoid onDraw(Canvas canvas) {  
  26.     super.onDraw(canvas);  
  27.     paint.setAntiAlias(true);  
  28.     paint.setStyle(Style.FILL);  
  29.     paint.setColor(0xffcccccc);  
  30.     canvas.drawPath(sPath, paint); // 畫出田徑場
  31.     paint.reset();  
  32. }  
  1. privatefinal Paint paint = new Paint();  
  2. privatefinal Path sPath = new Path();  
  3. privateint mWidth, mHeight;  
  4. privatefloat sWidth, sHeight;  
  5. privatefloat sLeft, sTop, sRight, sBottom;  
  6. privatefloat sCenterX, sCenterY;  
  7. @Overrideprotectedvoid onSizeChanged(int w, int h, int oldw, int oldh) {  
  8.     super.onSizeChanged(w, h, oldw, oldh);  
  9.     mWidth = w; // 檢視自身寬度
  10.     mHeight = h; // 檢視自身高度
  11.     sLeft = sTop = 0// 田徑場 左和上的座標
  12.     sRight = mWidth; // 田徑場 右佔自身的全部
  13.     sBottom = mHeight * 0.8f; // 田徑場底部 佔全身的百分之八十, 下面預留百分之二十的空間畫按鈕陰影。
  14.     sWidth = sRight - sLeft; // 田徑場的寬度
  15.     sHeight = sBottom - sTop; // 田徑場的高度
  16.     sCenterX = (sRight + sLeft) / 2// 田徑場的X軸中心座標
  17.     sCenterY = (sBottom + sTop) / 2// 田徑場的Y軸中心座標
  18.     RectF sRectF = new RectF(sLeft, sTop, sBottom, sBottom);  
  19.     sPath.arcTo(sRectF, 90180);  
  20.     sRectF.left = sRight - sBottom;  
  21.     sRectF.right = sRight;  
  22. 相關推薦

    Android View 仿iOS SwitchButton各種效果集合

    自學android差不多有一年了,從最初的小白菜鳥,摸爬滾打,看大神們的部落格,android官網的api,某網站的視訊教學,github開源專案。奮鬥這麼久隱隱感覺自己可以脫離新手的身份了,交出這篇文章權當作andriod小學水準的畢業典禮。 iOS Switch

    android ListView 仿IOS 回彈效果

    最近看IOS的下拉效果感覺很不錯,當拉倒最上面和最下面的時候繼續拉動會有緩衝,想在android裡面也做一個,到網上到處找,沒有找到好的方法,據說android新的API對ListView有這樣的支援,感覺不是特別好用。 自己利用scroller實現了一下,廢話不多說了直接

    android仿IOS頁面回彈效果

    碼農同學們做過手機開發的相比一定對ios平臺頁面的上下回彈效果印象深刻,特別是android開發對此是各種嫉妒羨慕恨啊,在特效方面蘋果做的很好,做了很多,當然谷歌也不差,神馬特效咱們都能做出來,因為android開放更多,移植性也更好,so..我特麼手賤自己寫了一個上下拉動

    前端 html h5 移動端 手機端 仿ios左滑刪除效果

    es2017 b- open translate def sna 技術 9.png replace 實現功能:左滑列表項(<li class="route-item" ></li>),出現刪除按鈕(<div class="removeJs"&

    Android View 的工作流程原理

    生成 它的 isl canvas mask lis mat cep 少見 參考資料 << Android 開發藝術探索 >> 前言 在日常開發中,我們每天都在和各種 View 打交道,比如TextView,Button等,我們直接拿過來就可以使用

    [譯]Android view 測量布局繪制的流程

    註意 images draw can www -i str 中一 opengl-es 原文鏈接 創造優秀的用戶體驗是我們開發者的主要目標之一.為此, 我們首先要了解系統是如何工作的, 這樣我們才可以更好的與系統配合, 從它的優點中獲益, 規避它的缺陷.

    仿ios SwitchButton----(自認為仿的還不錯)

    這篇文章來介紹這兩天的成果,android自帶的switchbutton太難看了,於是照著ios的switchbutton做了一個高仿的自定義switchbutton,目前還不是很完美,程式碼也還比較亂,但還是分享出來,望大家指教! 先看效果圖(不知道怎麼搞gif圖片,就先

    Android仿IOS的滑動按鈕

    專案結構 MainActivity public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedIns

    仿IOS的地區選擇效果

    ,練習了一下地區選擇器。首先非常感謝這位童鞋的無私分享!之所以重新動手練習下,是因為該開源專案裡面沒有完整的json資料串,我從網上找了一份二級地區的json,我的專案地址為:https://github.com/xyzlf/AreaSelector 效果圖:

    Android實現仿qq側邊欄效果

    public class MenuActivity extends FragmentActivity implements View.OnClickListener{ private ResideMenu resideMenu; private MenuActivity mContext;

    android仿IOS水滴版上下拉重新整理的Listview

           之前有分享一些重新整理的Demo,最近找到一個重新整理的例子,分享給大家。同時感謝原作者的分享!        現在給大家分享一個高仿IOS的Listview重新整理效果,支援上下拉重新

    各種效果集合

    1. 美團Android自動化之旅-生成渠道包:http://tech.meituan.com/mt-apk-packaging.html 1.1新一代Android渠道打包工具:1000個渠道包只需要5秒:http://www.finalshares.com/read-6735?f=

    Android開發】安卓炫酷效果集合

    1. android-ripple-background 能產生波浪效果的背景圖片控制元件,可以自定義顏色,波浪擴充套件的速度,波浪的圈數。 github地址 2. android-shapeLoadingView-master 高仿新版58 載入動畫 github地址 3. Arr

    AndroidAndroid開發實現帶有反彈效果仿IOS反彈scrollview詳解教程

    作者:程式設計師小冰,GitHub主頁:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先給大家看一下我們今天這個最終實現的效果圖: 這個是ios中的反彈效果。當然我

    Android 實現高仿iOS桌面效果之可拖動的GridView(上)

         最近專案中遇到一個LIstview的拖動效果,github上一搜發現有叫DragListview的開源專案,然後自己再小手一搜拖動排序的GridView,卻沒發現什麼很全很好的開源專案,後

    Android仿ios底部彈出框效果

    準備: public class ActionSheet { public interface OnActionSheetSelected { void onClick(int whichButton); } private ActionShee

    Android自定義載入等待Dialog彈窗控制元件(仿ios效果實現)

    效果圖 使用說明 1、專案下的build.gradle新增 allprojects { repositories { ... maven { url 'https://www.ji

    實現自定義view(2):仿Android QQ多螢幕顯示ListView的效果

    本文在《仿 UC,墨跡天氣左右拖動 多螢幕顯示效果》的基礎上對程式碼進行修改,模仿Android QQ主介面的分屏ListView滑動效果。 當進行橫向滑動時,會切換螢幕,當縱向滑動時,ListView會滾動。 效果圖如下: 程式碼如下: FlingGallery.

    Android自定義View-仿華為手機管家病毒查殺類似於雷達掃描動畫效果

    最近在使用華為手機管家病毒查殺時有一個類似雷達掃描的動畫,發現該動畫旋轉軸未對準圓心,如下圖: 這樣不仔細看,看不出來,咱們放大看一下,放大後如下: 現在我們可以清楚看到這個問題,於是想自己實現一把,好了,為了便於理解,這裡就按照動畫所見內容依次展開來說。 先簡單的分析一

    android 仿 ios 搜尋介面跳轉效果

    最新寫專案的時候,看到搜尋介面的跳轉基本都是點選搜尋然後跳轉到下個頁面,android 微信上則是 類似toolbar的效果,而ios 上則是一個搜尋框上移然後顯示新介面的一個效果。仔細研究了下發現和android 的 共享元素的過渡實現 的效果很像,所以在此模