Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android UI設計系列之自定義SwitchButton開關實現類似IOS中UISwitch的動畫效果(2)

Android UI設計系列之自定義SwitchButton開關實現類似IOS中UISwitch的動畫效果(2)

編輯:關於Android編程

做IOS開發的都知道,IOS提供了一個具有動態開關效果的UISwitch組件,這個組件很好用效果相對來說也很絢麗,當我們去點擊開關的時候有動畫效果,但遺憾的是Android上並沒有給我們提供類似的組件(聽說在Android4.0的版本上提供了具有動態效果的開關組件,不過我還沒有去看文檔),如果我們想實現類似的效果那該怎麼辦了呢?看來又得去自定義了。
公司的產品最近一直在做升級,主要做的就是把界面做的更絢麗更美觀給用戶更好的體驗(唉,顧客是上帝......),其中的設置功能中就有開關按鈕,原來的開關做的是兩幅圖片,通過點擊圖片來給開關設置不同的狀態圖片,但是這種效果很死板和程序的整體風格不太協調,於是就想著實現類似於IOS中的開關效果。
拿著筆在圖紙上畫了畫,我實現的原理也是采用了兩幅圖片,一個整體的背景圖:和一個小滑塊圖:,用小滑塊圖實現在背景圖上滑動,當小滑塊滑到左邊時恰好遮擋了開字,就是顯示的關了,同樣原理當小滑塊滑動到右側時恰好遮擋了關字也就是現實開了,滑動的實現主要用的就是TranslateAnimation類,如有對TranslateAnimation不太熟悉的,問問度娘,她那有關TranslateAnimation的解說多了去了,畢竟自己動手,豐衣食足嘛,(*^__^*) 嘻嘻……
好了,老規矩來看一下項目結構吧:


工程中switch_button.xml文件就是對應的SwitchButton的布局文件,內容不需要解釋,你一看就懂

<?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的布局文件中根節點是個LinearLayout,把它的背景設置成了一個含有開關文字的圖片,裡邊包含一個ImageView,這個ImageView就是用來在LinearLayout中進行滑動的。
其中自定義開關組件就是都在wedgit包下的SwitchButton,那麼趕緊來看一下SwitchButton的代碼吧

public class SwitchButton extends LinearLayout { 
 
 /** 
  * 開關圖片 
  */ 
 private LinearLayout switchParent; 
 /** 
  * 滑塊圖片 
  */ 
 private ImageView switchButton; 
 /** 
  * 按鈕狀態,默認關閉 
  */ 
 private boolean isOn = false; 
 /** 
  * 滑塊需要滑動的距離 
  */ 
 private int scrollDistance; 
 /** 
  * 開關按鈕監聽器 
  */ 
 private SwitchChangedListner listner; 
 
 public SwitchButton(Context context) { 
  super(context); 
  initWedgits(context); 
 } 
 
 public SwitchButton(Context context, AttributeSet attrs) { 
  super(context, attrs); 
  initWedgits(context); 
 } 
 
 /** 
  * 初始化組件 
  * 
  * @param context 
  *   上下文環境 
  */ 
 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(); 
  } 
 } 
 
 /** 
  * 添加事件監聽器 
  */ 
 private void addListeners() { 
  try { 
   switchParent.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     isOn = !isOn; 
     scrollSwitch(); 
     if (null != listner) { 
      // 開關開發或者關閉的回調方法 
      listner.switchChanged(getId(), isOn); 
     } 
    } 
   }); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
 } 
 
 /** 
  * 滑動開關 
  */ 
 private void scrollSwitch() { 
  // 獲取滑塊需要滑動的距離,滑動距離等於父組建的寬度減去滑塊的寬度 
  scrollDistance = switchParent.getWidth() - switchButton.getWidth(); 
  // 初始化滑動事件 
  Animation animation = null; 
  if (isOn) { 
   animation = new TranslateAnimation(0, scrollDistance, 0, 0); 
  } else { 
   animation = new TranslateAnimation(scrollDistance, 0, 0, 0); 
  } 
  // 設置滑動時間 
  animation.setDuration(200); 
  // 滑動之後保持狀態 
  animation.setFillAfter(true); 
  // 開始滑動 
  switchButton.startAnimation(animation); 
 } 
 
 /** 
  * 獲取開關狀態 
  * 
  * @return 【true:打開】【false:關閉】 
  */ 
 public boolean isOn() { 
  return isOn; 
 } 
 
 /** 
  * 設置開關狀態 
  * 
  * @param isOn 
  *   開關狀態【true:打開】【false:關閉】 
  */ 
 public void setOn(boolean isOn) { 
  if (this.isOn == isOn) { 
   return; 
  } 
  this.isOn = isOn; 
  post(new Runnable() { 
   @Override 
   public void run() { 
    scrollSwitch(); 
   } 
  }); 
 } 
 
 /** 
  * 設置開關狀態監聽器 
  * 
  * @param listner 
  *   開關狀態監聽器 
  */ 
 public void setOnSwitchListner(SwitchChangedListner listner) { 
  this.listner = listner; 
 } 
 
 /** 
  * 開關狀態監聽器 
  * 
  * @author llew 
  * 
  */ 
 public interface SwitchChangedListner { 
  /** 
   * 開關狀態改變 
   * 
   * @param viewId 
   *   當前開關ID 
   * @param isOn 
   *   開關是否打開【true:打開】【false:關閉】 
   */ 
  public void switchChanged(Integer viewId, boolean isOn); 
 } 
} 

SwitchButton的實現也很簡單,首先是初始化組件initWedgits(),然後添加事件監聽器addListeners(),在監聽器中做邏輯判斷,代碼都有注釋,就不再詳細說明了
那麼到了最後,我們來看看MainActivity中對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(); 
  } 
 } 
  
 /** 
  * 添加事件監聽器 
  */ 
 private void addListeners() { 
  try { 
   switchButton.setOnSwitchListner(new SwitchChangedListner() { 
    @Override 
    public void switchChanged(Integer viewId, boolean isOn) { 
     if(isOn) { 
      Toast.makeText(getApplicationContext(), "開關打開了", Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(getApplicationContext(), "開關關閉了", Toast.LENGTH_LONG).show(); 
     } 
    } 
   }); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
 } 
} 

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


很遺憾的是,木有動畫效果,嗚嗚~~~~(>_<)~~~~ ,先這樣吧,呵呵
好了,基本上自定義開關組件到這裡就講完了,如有不足,請大家諒解。

源碼下載: Android UI實現類似IOS中UISwitch的動畫效果

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved