最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android UI設(shè)計(jì)系列之自定義SwitchButton開(kāi)關(guān)實(shí)現(xiàn)類(lèi)似IOS中UISwitch的動(dòng)畫(huà)效果(2)

 更新時(shí)間:2022年07月20日 15:30:46   作者:llew2011  
這篇文章主要介紹了Android UI設(shè)計(jì)系列之自定義SwitchButton開(kāi)關(guān)實(shí)現(xiàn)類(lèi)似IOS中UISwitch的動(dòng)畫(huà)效果,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下

做IOS開(kāi)發(fā)的都知道,IOS提供了一個(gè)具有動(dòng)態(tài)開(kāi)關(guān)效果的UISwitch組件,這個(gè)組件很好用效果相對(duì)來(lái)說(shuō)也很絢麗,當(dāng)我們?nèi)c(diǎn)擊開(kāi)關(guān)的時(shí)候有動(dòng)畫(huà)效果,但遺憾的是Android上并沒(méi)有給我們提供類(lèi)似的組件(聽(tīng)說(shuō)在Android4.0的版本上提供了具有動(dòng)態(tài)效果的開(kāi)關(guān)組件,不過(guò)我還沒(méi)有去看文檔),如果我們想實(shí)現(xiàn)類(lèi)似的效果那該怎么辦了呢?看來(lái)又得去自定義了。

公司的產(chǎn)品最近一直在做升級(jí),主要做的就是把界面做的更絢麗更美觀給用戶更好的體驗(yàn)(唉,顧客是上帝......),其中的設(shè)置功能中就有開(kāi)關(guān)按鈕,原來(lái)的開(kāi)關(guān)做的是兩幅圖片,通過(guò)點(diǎn)擊圖片來(lái)給開(kāi)關(guān)設(shè)置不同的狀態(tài)圖片,但是這種效果很死板和程序的整體風(fēng)格不太協(xié)調(diào),于是就想著實(shí)現(xiàn)類(lèi)似于IOS中的開(kāi)關(guān)效果。

拿著筆在圖紙上畫(huà)了畫(huà),我實(shí)現(xiàn)的原理也是采用了兩幅圖片,一個(gè)整體的背景圖:和一個(gè)小滑塊圖:,用小滑塊圖實(shí)現(xiàn)在背景圖上滑動(dòng),當(dāng)小滑塊滑到左邊時(shí)恰好遮擋了開(kāi)字,就是顯示的關(guān)了,同樣原理當(dāng)小滑塊滑動(dòng)到右側(cè)時(shí)恰好遮擋了關(guān)字也就是現(xiàn)實(shí)開(kāi)了,滑動(dòng)的實(shí)現(xiàn)主要用的就是TranslateAnimation類(lèi),如有對(duì)TranslateAnimation不太熟悉的,問(wèn)問(wèn)度娘,她那有關(guān)TranslateAnimation的解說(shuō)多了去了,畢竟自己動(dòng)手,豐衣食足嘛,(*^__^*) 嘻嘻……

好了,老規(guī)矩來(lái)看一下項(xiàng)目結(jié)構(gòu)吧:

工程中switch_button.xml文件就是對(duì)應(yīng)的SwitchButton的布局文件,內(nèi)容不需要解釋?zhuān)阋豢淳投?/p>

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
 xmlns:android="http://schemas.android.com/apk/res/android" 
 android:id="@+id/switch_parent" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:background="@drawable/switch_bg"> 
 
 <ImageView 
 android:id="@+id/switch_button" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content" 
 android:src="@drawable/switch_btn" /> 
 
</LinearLayout> 

SwitchButton的布局文件中根節(jié)點(diǎn)是個(gè)LinearLayout,把它的背景設(shè)置成了一個(gè)含有開(kāi)關(guān)文字的圖片,里邊包含一個(gè)ImageView,這個(gè)ImageView就是用來(lái)在LinearLayout中進(jìn)行滑動(dòng)的。
其中自定義開(kāi)關(guān)組件就是都在wedgit包下的SwitchButton,那么趕緊來(lái)看一下SwitchButton的代碼吧

public class SwitchButton extends LinearLayout { 
 
 /** 
 * 開(kāi)關(guān)圖片 
 */ 
 private LinearLayout switchParent; 
 /** 
 * 滑塊圖片 
 */ 
 private ImageView switchButton; 
 /** 
 * 按鈕狀態(tài),默認(rèn)關(guān)閉 
 */ 
 private boolean isOn = false; 
 /** 
 * 滑塊需要滑動(dòng)的距離 
 */ 
 private int scrollDistance; 
 /** 
 * 開(kāi)關(guān)按鈕監(jiān)聽(tīng)器 
 */ 
 private SwitchChangedListner listner; 
 
 public SwitchButton(Context context) { 
 super(context); 
 initWedgits(context); 
 } 
 
 public SwitchButton(Context context, AttributeSet attrs) { 
 super(context, attrs); 
 initWedgits(context); 
 } 
 
 /** 
 * 初始化組件 
 * 
 * @param context 
 *  上下文環(huán)境 
 */ 
 private void initWedgits(Context context) { 
 try { 
  View view = LayoutInflater.from(context).inflate( 
   R.layout.switch_button, this); 
  switchParent = (LinearLayout) view.findViewById(R.id.switch_parent); 
  switchButton = (ImageView) view.findViewById(R.id.switch_button); 
  addListeners(); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 } 
 
 /** 
 * 添加事件監(jiān)聽(tīng)器 
 */ 
 private void addListeners() { 
 try { 
  switchParent.setOnClickListener(new OnClickListener() { 
  @Override 
  public void onClick(View v) { 
   isOn = !isOn; 
   scrollSwitch(); 
   if (null != listner) { 
   // 開(kāi)關(guān)開(kāi)發(fā)或者關(guān)閉的回調(diào)方法 
   listner.switchChanged(getId(), isOn); 
   } 
  } 
  }); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 } 
 
 /** 
 * 滑動(dòng)開(kāi)關(guān) 
 */ 
 private void scrollSwitch() { 
 // 獲取滑塊需要滑動(dòng)的距離,滑動(dòng)距離等于父組建的寬度減去滑塊的寬度 
 scrollDistance = switchParent.getWidth() - switchButton.getWidth(); 
 // 初始化滑動(dòng)事件 
 Animation animation = null; 
 if (isOn) { 
  animation = new TranslateAnimation(0, scrollDistance, 0, 0); 
 } else { 
  animation = new TranslateAnimation(scrollDistance, 0, 0, 0); 
 } 
 // 設(shè)置滑動(dòng)時(shí)間 
 animation.setDuration(200); 
 // 滑動(dòng)之后保持狀態(tài) 
 animation.setFillAfter(true); 
 // 開(kāi)始滑動(dòng) 
 switchButton.startAnimation(animation); 
 } 
 
 /** 
 * 獲取開(kāi)關(guān)狀態(tài) 
 * 
 * @return 【true:打開(kāi)】【false:關(guān)閉】 
 */ 
 public boolean isOn() { 
 return isOn; 
 } 
 
 /** 
 * 設(shè)置開(kāi)關(guān)狀態(tài) 
 * 
 * @param isOn 
 *  開(kāi)關(guān)狀態(tài)【true:打開(kāi)】【false:關(guān)閉】 
 */ 
 public void setOn(boolean isOn) { 
 if (this.isOn == isOn) { 
  return; 
 } 
 this.isOn = isOn; 
 post(new Runnable() { 
  @Override 
  public void run() { 
  scrollSwitch(); 
  } 
 }); 
 } 
 
 /** 
 * 設(shè)置開(kāi)關(guān)狀態(tài)監(jiān)聽(tīng)器 
 * 
 * @param listner 
 *  開(kāi)關(guān)狀態(tài)監(jiān)聽(tīng)器 
 */ 
 public void setOnSwitchListner(SwitchChangedListner listner) { 
 this.listner = listner; 
 } 
 
 /** 
 * 開(kāi)關(guān)狀態(tài)監(jiān)聽(tīng)器 
 * 
 * @author llew 
 * 
 */ 
 public interface SwitchChangedListner { 
 /** 
  * 開(kāi)關(guān)狀態(tài)改變 
  * 
  * @param viewId 
  *  當(dāng)前開(kāi)關(guān)ID 
  * @param isOn 
  *  開(kāi)關(guān)是否打開(kāi)【true:打開(kāi)】【false:關(guān)閉】 
  */ 
 public void switchChanged(Integer viewId, boolean isOn); 
 } 
} 

SwitchButton的實(shí)現(xiàn)也很簡(jiǎn)單,首先是初始化組件initWedgits(),然后添加事件監(jiān)聽(tīng)器addListeners(),在監(jiān)聽(tīng)器中做邏輯判斷,代碼都有注釋?zhuān)筒辉僭敿?xì)說(shuō)明了
那么到了最后,我們來(lái)看看MainActivity中對(duì)SwitchButton的用法吧

public class MainActivity extends Activity { 
 
 private SwitchButton switchButton; 
 
 /** Called when the activity is first created. */ 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
 super.onCreate(savedInstanceState); 
 setContentView(R.layout.main); 
 initWedgits(); 
 } 
 
 /** 
 * 初始化各組件 
 */ 
 private void initWedgits() { 
 try { 
  switchButton = (SwitchButton) findViewById(R.id.switchButton); 
  // switchButton.setOn(false); 
  switchButton.setOn(true); 
  addListeners(); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 } 
 
 /** 
 * 添加事件監(jiān)聽(tīng)器 
 */ 
 private void addListeners() { 
 try { 
  switchButton.setOnSwitchListner(new SwitchChangedListner() { 
  @Override 
  public void switchChanged(Integer viewId, boolean isOn) { 
   if(isOn) { 
   Toast.makeText(getApplicationContext(), "開(kāi)關(guān)打開(kāi)了", Toast.LENGTH_LONG).show(); 
   } else { 
   Toast.makeText(getApplicationContext(), "開(kāi)關(guān)關(guān)閉了", Toast.LENGTH_LONG).show(); 
   } 
  } 
  }); 
 } catch (Exception e) { 
  e.printStackTrace(); 
 } 
 } 
} 

好了,代碼都貼完了,接下來(lái)看看運(yùn)行效果吧,(*^__^*) 嘻嘻……

很遺憾的是,木有動(dòng)畫(huà)效果,先這樣
好了,基本上自定義開(kāi)關(guān)組件到這里就講完了,如有不足,請(qǐng)大家諒解。

源碼下載:Android UI實(shí)現(xiàn)類(lèi)似IOS中UISwitch的動(dòng)畫(huà)效果

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

相關(guān)文章

  • Android 藍(lán)牙連接 ESC/POS 熱敏打印機(jī)打印實(shí)例(藍(lán)牙連接篇)

    Android 藍(lán)牙連接 ESC/POS 熱敏打印機(jī)打印實(shí)例(藍(lán)牙連接篇)

    這篇文章主要介紹了Android 藍(lán)牙連接 ESC/POS 熱敏打印機(jī)打印實(shí)例(藍(lán)牙連接篇),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • Matrix的set,pre,post調(diào)用順序詳解

    Matrix的set,pre,post調(diào)用順序詳解

    下面小編就為大家?guī)?lái)一篇Matrix的set,pre,post調(diào)用順序詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Flutter禁止手機(jī)橫屏的簡(jiǎn)單實(shí)現(xiàn)方法

    Flutter禁止手機(jī)橫屏的簡(jiǎn)單實(shí)現(xiàn)方法

    app默認(rèn)是可以橫屏的,如果需要禁止橫屏話可以參考這篇文章,本文主要給大家介紹了關(guān)于Flutter禁止手機(jī)橫屏的簡(jiǎn)單實(shí)現(xiàn)方法,需要的朋友可以參考下
    2021-07-07
  • Android實(shí)現(xiàn)Toast提示框圖文并存的方法

    Android實(shí)現(xiàn)Toast提示框圖文并存的方法

    這篇文章主要介紹了Android實(shí)現(xiàn)Toast提示框圖文并存的方法,實(shí)例分析了Toast提示框的參數(shù)設(shè)置及圖文調(diào)用的相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Android使用OpenGL和MediaCodec錄制功能

    Android使用OpenGL和MediaCodec錄制功能

    OpenGL是一個(gè)跨平臺(tái)的操作GPU的API,但OpenGL需要本地視窗系統(tǒng)進(jìn)行交互,這就需要一個(gè)中間控制層, EGL就是連接OpenGL ES和本地窗口系統(tǒng)的接口,引入EGL就是為了屏蔽不同平臺(tái)上的區(qū)別,這篇文章主要介紹了Android使用OpenGL和MediaCodec錄制功能,需要的朋友可以參考下
    2025-04-04
  • Android?Studio簡(jiǎn)單實(shí)現(xiàn)自定義日歷

    Android?Studio簡(jiǎn)單實(shí)現(xiàn)自定義日歷

    這篇文章主要為大家詳細(xì)介紹了Android?Studio簡(jiǎn)單實(shí)現(xiàn)自定義日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android無(wú)需申請(qǐng)權(quán)限撥打電話的兩種方式

    Android無(wú)需申請(qǐng)權(quán)限撥打電話的兩種方式

    android 打電話有兩種實(shí)現(xiàn)方式,第一種方法撥打電話跳轉(zhuǎn)到撥號(hào)界面,第二種方法,撥打電話直接進(jìn)行撥打,下面逐一給大家介紹這兩種方式,需要的朋友參考下吧
    2016-12-12
  • Android實(shí)現(xiàn)支付寶6位密碼輸入界面

    Android實(shí)現(xiàn)支付寶6位密碼輸入界面

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)支付寶6位密碼輸入界面的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android筆記之:App應(yīng)用之啟動(dòng)界面SplashActivity的使用

    Android筆記之:App應(yīng)用之啟動(dòng)界面SplashActivity的使用

    當(dāng)前比較成熟一點(diǎn)的應(yīng)用基本上都會(huì)在進(jìn)入應(yīng)用之顯示一個(gè)啟動(dòng)界面.這個(gè)啟動(dòng)界面或簡(jiǎn)單,或復(fù)雜,或簡(jiǎn)陋,或華麗,用意不同,風(fēng)格也不同
    2013-04-04
  • android九宮格鎖屏控件使用詳解

    android九宮格鎖屏控件使用詳解

    這篇文章主要為大家詳細(xì)介紹了android九宮格鎖屏控件使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論

安康市| 体育| 肇源县| 永州市| 富平县| 紫云| 屯门区| 喀喇沁旗| 清水河县| 米泉市| 博野县| 合水县| 岢岚县| 子洲县| 永吉县| 西畴县| 涿鹿县| 剑河县| 娱乐| 满洲里市| 沙坪坝区| 华安县| 宁明县| 三门县| 牟定县| 平顺县| 胶南市| 邵东县| 湘潭市| 儋州市| 千阳县| 和田市| 微博| 海盐县| 龙游县| 清河县| 宜兰市| 望城县| 龙州县| 荔波县| 高要市|