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

Android 動(dòng)態(tài)菜單實(shí)現(xiàn)實(shí)例代碼

 更新時(shí)間:2017年01月16日 11:33:39   投稿:lqh  
這篇文章主要介紹了Android 動(dòng)態(tài)菜單實(shí)現(xiàn)實(shí)例代碼的相關(guān)資料,這里附有實(shí)例代碼及實(shí)現(xiàn)效果圖,需要的朋友可以參考下

Android 動(dòng)態(tài)菜單

先上效果圖

這里寫(xiě)圖片描述

比較簡(jiǎn)單,主要就是屬性動(dòng)畫(huà)的使用和坐標(biāo)角度的小細(xì)節(jié)。

實(shí)現(xiàn)

實(shí)現(xiàn)效果:
圖標(biāo)按照路徑一路縮放漸變過(guò)來(lái)即可。

核心代碼

 /**
   * Item開(kāi)啟動(dòng)畫(huà)
   *
   * @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中根據(jù)度數(shù)得到弧度值的函數(shù)
    int translationX = -(int) (radius * Math.sin(degree));
    int translationY = -(int) (radius * Math.cos(degree));

    AnimatorSet set = new AnimatorSet();
    //實(shí)現(xiàn)平移縮放和透明動(dòng)畫(huà)
    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關(guān)閉動(dòng)畫(huà)
   *
   * @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();
    //包含平移、縮放和透明度動(dòng)畫(huà)
    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開(kāi)啟動(dòng)畫(huà)和關(guān)閉動(dòng)畫(huà)為一個(gè)逆過(guò)程,體現(xiàn)在x,y距離變化上。

這里寫(xiě)圖片描述

x,y的距離開(kāi)啟時(shí)距離逐漸增長(zhǎng)

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

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

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

或者使用PI=180°來(lái)折算

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

實(shí)例代碼:

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, "點(diǎn)擊了Item1", Toast.LENGTH_SHORT).show();
        break;
      case R.id.btnItem2:
        Toast.makeText(StatelliteActivity.this, "點(diǎn)擊了Item2", Toast.LENGTH_SHORT).show();
        break;
      case R.id.btnItem3:
        Toast.makeText(StatelliteActivity.this, "點(diǎn)擊了Item3", Toast.LENGTH_SHORT).show();
        break;
      case R.id.btnItem4:
        Toast.makeText(StatelliteActivity.this, "點(diǎn)擊了Item4", Toast.LENGTH_SHORT).show();
        break;
      case R.id.btnItem5:
        Toast.makeText(StatelliteActivity.this, "點(diǎn)擊了Item5", Toast.LENGTH_SHORT).show();
        break;
    }

  }

  private void showItemAnimator() {
    if (!isMenuOpen) {
      //此時(shí)menu是關(guān)閉的
      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 {
      //此時(shí)menu是打開(kāi)的
      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);
    }
  }

  /**
   * 關(guān)閉動(dòng)畫(huà)
   *
   * @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();
    //包含平移、縮放和透明度動(dòng)畫(huà)
    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);
    }
  }

  /**
   * 開(kāi)啟動(dòng)畫(huà)
   *
   * @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中根據(jù)度數(shù)得到弧度值的函數(shù)
    int translationX = -(int) (radius * Math.sin(degree));
    int translationY = -(int) (radius * Math.cos(degree));

    AnimatorSet set = new AnimatorSet();
    //實(shí)現(xiàn)平移縮放和透明動(dòng)畫(huà)
    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();


  }
}

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

相關(guān)文章

最新評(píng)論

江川县| 垦利县| 桂东县| 朝阳区| 清镇市| 阿城市| 双桥区| 舒城县| 察雅县| 高邮市| 怀来县| 五河县| 临海市| 思茅市| 泽州县| 沂源县| 封丘县| 左云县| 集贤县| 修水县| 天全县| 林周县| 西和县| 佳木斯市| 南溪县| 敦煌市| 莎车县| 印江| 错那县| 札达县| 隆昌县| 博罗县| 惠州市| 峡江县| 阜新市| 岳普湖县| 望都县| 额敏县| 辰溪县| 磐石市| 从化市|