一看就喜欢的loading动画效果Android分析实现

2019-12-10 19:13:34于丽

最后,向外层暴露几个接口:

/** 
 * 设置中等振幅 
 *  
 * @param amplitude 
 */ 
public void setMiddleAmplitude(int amplitude) { 
  this.mMiddleAmplitude = amplitude; 
} 
 
/** 
 * 设置振幅差 
 *  
 * @param disparity 
 */ 
public void setMplitudeDisparity(int disparity) { 
  this.mAmplitudeDisparity = disparity; 
} 
 
/** 
 * 获取中等振幅 
 *  
 * @param amplitude 
 */ 
public int getMiddleAmplitude() { 
  return mMiddleAmplitude; 
} 
 
/** 
 * 获取振幅差 
 *  
 * @param disparity 
 */ 
public int getMplitudeDisparity() { 
  return mAmplitudeDisparity; 
} 
 
/** 
 * 设置进度 
 *  
 * @param progress 
 */ 
public void setProgress(int progress) { 
  this.mProgress = progress; 
  postInvalidate(); 
} 
 
/** 
 * 设置叶子飘完一个周期所花的时间 
 *  
 * @param time 
 */ 
public void setLeafFloatTime(long time) { 
  this.mLeafFloatTime = time; 
} 
 
/** 
 * 设置叶子旋转一周所花的时间 
 *  
 * @param time 
 */ 
public void setLeafRotateTime(long time) { 
  this.mLeafRotateTime = time; 

这些接口用来干嘛呢?用于把我们的动效做成完全可手动调节的,这样做有什么好处呢?
1. 更加便于产品、射鸡湿查看效果,避免YY,自己手动调节,不会出现要你一遍遍的改参数安装、查看、再改、再查看... ... N遍之后说 “这好像不是我想要的” -- 瞬间天崩地裂,天昏地暗,感觉被全世界抛弃;
2. 便于体现你是一个考虑全面,思维缜密,会编程、会设计的艺术家,当然这纯属YY,主要还是方便大家;

如此一来,射鸡湿们只需要不断的调节即可实时的看到展现的效果,最后只需要把最终的参数反馈过来即可,万事大吉,一了百了;
当然,如果对方是个漂亮的妹子,而你又苦于没有机会搭讪,以上内容就当我没说,尽情的不按要求写吧,她肯定会主动找你的,说不定连饭都反过来请了... ...

好啦,言归正传,完成收尾部分,我们让所有的参数都可调节起来:
把剩下的layout 和activity贴出来:
activity:

public class LeafLoadingActivity extends Activity implements OnSeekBarChangeListener, 
    OnClickListener { 
 
  Handler mHandler = new Handler() { 
    public void handleMessage(Message msg) { 
      switch (msg.what) { 
        case REFRESH_PROGRESS: 
          if (mProgress < 40) { 
            mProgress += 1; 
            // 随机800ms以内刷新一次 
            mHandler.sendEmptyMessageDelayed(REFRESH_PROGRESS, 
                new Random().nextInt(800)); 
            mLeafLoadingView.setProgress(mProgress); 
          } else { 
            mProgress += 1; 
            // 随机1200ms以内刷新一次 
            mHandler.sendEmptyMessageDelayed(REFRESH_PROGRESS, 
                new Random().nextInt(1200)); 
            mLeafLoadingView.setProgress(mProgress); 
 
          } 
          break; 
 
        default: 
          break; 
      } 
    }; 
  }; 
 
  private static final int REFRESH_PROGRESS = 0x10; 
  private LeafLoadingView mLeafLoadingView; 
  private SeekBar mAmpireSeekBar; 
  private SeekBar mDistanceSeekBar; 
  private TextView mMplitudeText; 
  private TextView mDisparityText; 
  private View mFanView; 
  private Button mClearButton; 
  private int mProgress = 0; 
 
  private TextView mProgressText; 
  private View mAddProgress; 
  private SeekBar mFloatTimeSeekBar; 
 
  private SeekBar mRotateTimeSeekBar; 
  private TextView mFloatTimeText; 
  private TextView mRotateTimeText; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.leaf_loading_layout); 
    initViews(); 
    mHandler.sendEmptyMessageDelayed(REFRESH_PROGRESS, 3000); 
  } 
 
  private void initViews() { 
    mFanView = findViewById(R.id.fan_pic); 
    RotateAnimation rotateAnimation = DXAnimationUtils.initRotateAnimation(false, 1500, true, 
        Animation.INFINITE); 
    mFanView.startAnimation(rotateAnimation); 
    mClearButton = (Button) findViewById(R.id.clear_progress); 
    mClearButton.setOnClickListener(this); 
 
    mLeafLoadingView = (LeafLoadingView) findViewById(R.id.leaf_loading); 
    mMplitudeText = (TextView) findViewById(R.id.text_ampair); 
    mMplitudeText.setText(getString(R.string.current_mplitude, 
        mLeafLoadingView.getMiddleAmplitude())); 
 
    mDisparityText = (TextView) findViewById(R.id.text_disparity); 
    mDisparityText.setText(getString(R.string.current_Disparity, 
        mLeafLoadingView.getMplitudeDisparity())); 
 
    mAmpireSeekBar = (SeekBar) findViewById(R.id.seekBar_ampair); 
    mAmpireSeekBar.setOnSeekBarChangeListener(this); 
    mAmpireSeekBar.setProgress(mLeafLoadingView.getMiddleAmplitude()); 
    mAmpireSeekBar.setMax(50); 
 
    mDistanceSeekBar = (SeekBar) findViewById(R.id.seekBar_distance); 
    mDistanceSeekBar.setOnSeekBarChangeListener(this); 
    mDistanceSeekBar.setProgress(mLeafLoadingView.getMplitudeDisparity()); 
    mDistanceSeekBar.setMax(20); 
 
    mAddProgress = findViewById(R.id.add_progress); 
    mAddProgress.setOnClickListener(this); 
    mProgressText = (TextView) findViewById(R.id.text_progress); 
 
    mFloatTimeText = (TextView) findViewById(R.id.text_float_time); 
    mFloatTimeSeekBar = (SeekBar) findViewById(R.id.seekBar_float_time); 
    mFloatTimeSeekBar.setOnSeekBarChangeListener(this); 
    mFloatTimeSeekBar.setMax(5000); 
    mFloatTimeSeekBar.setProgress((int) mLeafLoadingView.getLeafFloatTime()); 
    mFloatTimeText.setText(getResources().getString(R.string.current_float_time, 
        mLeafLoadingView.getLeafFloatTime())); 
 
    mRotateTimeText = (TextView) findViewById(R.id.text_rotate_time); 
    mRotateTimeSeekBar = (SeekBar) findViewById(R.id.seekBar_rotate_time); 
    mRotateTimeSeekBar.setOnSeekBarChangeListener(this); 
    mRotateTimeSeekBar.setMax(5000); 
    mRotateTimeSeekBar.setProgress((int) mLeafLoadingView.getLeafRotateTime()); 
    mRotateTimeText.setText(getResources().getString(R.string.current_float_time, 
        mLeafLoadingView.getLeafRotateTime())); 
  } 
 
  @Override 
  public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
    if (seekBar == mAmpireSeekBar) { 
      mLeafLoadingView.setMiddleAmplitude(progress); 
      mMplitudeText.setText(getString(R.string.current_mplitude, 
          progress)); 
    } else if (seekBar == mDistanceSeekBar) { 
      mLeafLoadingView.setMplitudeDisparity(progress); 
      mDisparityText.setText(getString(R.string.current_Disparity, 
          progress)); 
    } else if (seekBar == mFloatTimeSeekBar) { 
      mLeafLoadingView.setLeafFloatTime(progress); 
      mFloatTimeText.setText(getResources().getString(R.string.current_float_time, 
          progress)); 
    } 
    else if (seekBar == mRotateTimeSeekBar) { 
      mLeafLoadingView.setLeafRotateTime(progress); 
      mRotateTimeText.setText(getResources().getString(R.string.current_rotate_time, 
          progress)); 
    } 
 
  } 
 
  @Override 
  public void onStartTrackingTouch(SeekBar seekBar) { 
 
  } 
 
  @Override 
  public void onStopTrackingTouch(SeekBar seekBar) { 
 
  } 
 
  @Override 
  public void onClick(View v) { 
    if (v == mClearButton) { 
      mLeafLoadingView.setProgress(0); 
      mHandler.removeCallbacksAndMessages(null); 
      mProgress = 0; 
    } else if (v == mAddProgress) { 
      mProgress++; 
      mLeafLoadingView.setProgress(mProgress); 
      mProgressText.setText(String.valueOf(mProgress)); 
    } 
  } 
}