国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 動態菜單實現實例代碼

2019-12-12 04:01:14
字體:
來源:轉載
供稿:網友

Android 動態菜單

先上效果圖

這里寫圖片描述

比較簡單,主要就是屬性動畫的使用和坐標角度的小細節。

實現

實現效果:
圖標按照路徑一路縮放漸變過來即可。

核心代碼

 /**   * Item開啟動畫   *   * @param btnItem   * @param index   * @param total   * @param radius   */  private void btnItemStartAnimator(View btnItem, int index, int total, int radius) {    if (btnItem.getVisibility() != View.VISIBLE) {      btnItem.setVisibility(View.VISIBLE);    }    double degree = Math.toRadians(90) / (total - 1) * index;//Math中根據度數得到弧度值的函數    int translationX = -(int) (radius * Math.sin(degree));    int translationY = -(int) (radius * Math.cos(degree));    AnimatorSet set = new AnimatorSet();    //實現平移縮放和透明動畫    set.playTogether(        ObjectAnimator.ofFloat(btnItem, "translationX", 0, translationX),        ObjectAnimator.ofFloat(btnItem, "translationY", 0, translationY),        ObjectAnimator.ofFloat(btnItem, "scaleX", 0, 1),        ObjectAnimator.ofFloat(btnItem, "scaleY", 0, 1),        ObjectAnimator.ofFloat(btnItem, "alpha", 0, 1)    );    set.setInterpolator(new BounceInterpolator());    set.setDuration(500).start();  }  /**   * Item關閉動畫   *   * @param btnItem   * @param index   * @param total   * @param radius   */  private void btnItemCloseAnimator(View btnItem, int index, int total, int radius) {    double degree = Math.PI * index / ((total - 1) * 2);    int translationX = -(int) (radius * Math.sin(degree));    int translationY = -(int) (radius * Math.cos(degree));    AnimatorSet set = new AnimatorSet();    //包含平移、縮放和透明度動畫    set.playTogether(        ObjectAnimator.ofFloat(btnItem, "translationX", translationX, 0),        ObjectAnimator.ofFloat(btnItem, "translationY", translationY, 0),        ObjectAnimator.ofFloat(btnItem, "scaleX", 1f, 0f),        ObjectAnimator.ofFloat(btnItem, "scaleY", 1f, 0f),        ObjectAnimator.ofFloat(btnItem, "alpha", 1f, 0f));    set.setDuration(500).start();    if (btnItem.getVisibility() == View.VISIBLE) {      btnItem.setVisibility(View.INVISIBLE);    }  }

item開啟動畫和關閉動畫為一個逆過程,體現在x,y距離變化上。

這里寫圖片描述

x,y的距離開啟時距離逐漸增長

ObjectAnimator.ofFloat(btnItem, "translationX", 0, translationX),    ObjectAnimator.ofFloat(btnItem, "translationY", 0, translationY),

這里要注意下sin這些弧度的計算,可以使用Math.toRadins(數字)

 double degree = Math.toRadians(90) / (total - 1) * index;//Math中根據度數得到弧度值的函數    int translationX = -(int) (radius * Math.sin(degree));

或者使用PI=180°來折算

 double degree = Math.PI * index / ((total - 1) * 2);     int translationX = -(int) (radius * Math.sin(degree));

實例代碼:

package xsf.customView;import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.view.View;import android.view.animation.BounceInterpolator;import android.widget.Button;import android.widget.Toast;import xsf.customView.base.BaseActvity;public class StatelliteActivity extends BaseActvity {  private Button btnMenu, btnItem1, btnItem2, btnItem3, btnItem4, btnItem5;  private boolean isMenuOpen = false;  @Override  protected int setLayoutResourceId() {    return R.layout.activity_statellite;  }  @Override  protected void initView() {    btnMenu = (Button) findViewById(R.id.btnMenu);    btnMenu.setOnClickListener(this);    btnItem1 = (Button) findViewById(R.id.btnItem1);    btnItem1.setOnClickListener(this);    btnItem2 = (Button) findViewById(R.id.btnItem2);    btnItem2.setOnClickListener(this);    btnItem3 = (Button) findViewById(R.id.btnItem3);    btnItem3.setOnClickListener(this);    btnItem4 = (Button) findViewById(R.id.btnItem4);    btnItem4.setOnClickListener(this);    btnItem5 = (Button) findViewById(R.id.btnItem5);    btnItem5.setOnClickListener(this);  }    @Override  public void onClick(View v) {    btnMenu.requestFocus();    switch (v.getId()) {      case R.id.btnMenu:        showItemAnimator();        break;      case R.id.btnItem1:        Toast.makeText(StatelliteActivity.this, "點擊了Item1", Toast.LENGTH_SHORT).show();        break;      case R.id.btnItem2:        Toast.makeText(StatelliteActivity.this, "點擊了Item2", Toast.LENGTH_SHORT).show();        break;      case R.id.btnItem3:        Toast.makeText(StatelliteActivity.this, "點擊了Item3", Toast.LENGTH_SHORT).show();        break;      case R.id.btnItem4:        Toast.makeText(StatelliteActivity.this, "點擊了Item4", Toast.LENGTH_SHORT).show();        break;      case R.id.btnItem5:        Toast.makeText(StatelliteActivity.this, "點擊了Item5", Toast.LENGTH_SHORT).show();        break;    }  }  private void showItemAnimator() {    if (!isMenuOpen) {      //此時menu是關閉的      isMenuOpen = true;      btnItemStartAnimator(btnItem1, 0, 5, 300);      btnItemStartAnimator(btnItem2, 1, 5, 300);      btnItemStartAnimator(btnItem3, 2, 5, 300);      btnItemStartAnimator(btnItem4, 3, 5, 300);      btnItemStartAnimator(btnItem5, 4, 5, 300);    } else {      //此時menu是打開的      isMenuOpen = false;      btnItemCloseAnimator(btnItem1, 0, 5, 300);      btnItemCloseAnimator(btnItem2, 1, 5, 300);      btnItemCloseAnimator(btnItem3, 2, 5, 300);      btnItemCloseAnimator(btnItem4, 3, 5, 300);      btnItemCloseAnimator(btnItem5, 4, 5, 300);    }  }  /**   * 關閉動畫   *   * @param btnItem   * @param index   * @param total   * @param radius   */  private void btnItemCloseAnimator(View btnItem, int index, int total, int radius) {    double degree = Math.PI * index / ((total - 1) * 2);    int translationX = -(int) (radius * Math.sin(degree));    int translationY = -(int) (radius * Math.cos(degree));    AnimatorSet set = new AnimatorSet();    //包含平移、縮放和透明度動畫    set.playTogether(        ObjectAnimator.ofFloat(btnItem, "translationX", translationX, 0),        ObjectAnimator.ofFloat(btnItem, "translationY", translationY, 0),        ObjectAnimator.ofFloat(btnItem, "scaleX", 1f, 0f),        ObjectAnimator.ofFloat(btnItem, "scaleY", 1f, 0f),        ObjectAnimator.ofFloat(btnItem, "alpha", 1f, 0f));    set.setDuration(500).start();    if (btnItem.getVisibility() == View.VISIBLE) {      btnItem.setVisibility(View.INVISIBLE);    }  }  /**   * 開啟動畫   *   * @param btnItem   * @param index   * @param total   * @param radius   */  private void btnItemStartAnimator(View btnItem, int index, int total, int radius) {    if (btnItem.getVisibility() != View.VISIBLE) {      btnItem.setVisibility(View.VISIBLE);    }    double degree = Math.toRadians(90) / (total - 1) * index;//Math中根據度數得到弧度值的函數    int translationX = -(int) (radius * Math.sin(degree));    int translationY = -(int) (radius * Math.cos(degree));    AnimatorSet set = new AnimatorSet();    //實現平移縮放和透明動畫    set.playTogether(        ObjectAnimator.ofFloat(btnItem, "translationX", 0, translationX),        ObjectAnimator.ofFloat(btnItem, "translationY", 0, translationY),        ObjectAnimator.ofFloat(btnItem, "scaleX", 0, 1),        ObjectAnimator.ofFloat(btnItem, "scaleY", 0, 1),        ObjectAnimator.ofFloat(btnItem, "alpha", 0, 1)    );    set.setInterpolator(new BounceInterpolator());    set.setDuration(500).start();  }}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 铁岭县| 阳春市| 濮阳县| 盐亭县| 双辽市| 昭觉县| 湘潭县| 左云县| 洞头县| 遂宁市| 珠海市| 昭通市| 高陵县| 丘北县| 德庆县| 朔州市| 邢台市| 布拖县| 新河县| 晋宁县| 辽源市| 石城县| 会泽县| 望谟县| 香格里拉县| 水城县| 遵化市| 丰台区| 滦南县| 祥云县| 托克逊县| 无极县| 潼关县| 平湖市| 澜沧| 东明县| 北流市| 蓬安县| 靖远县| 蒙城县| 桦南县|