欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android自定义Animation实现View摇摆效果

程序员文章站 2024-02-21 18:55:16
使用自定义animation,实现view的左右摇摆效果,如图所示: 代码很简单,直接上源码 activity_maini.xml布局文件: <...

使用自定义animation,实现view的左右摇摆效果,如图所示:

Android自定义Animation实现View摇摆效果

代码很简单,直接上源码

activity_maini.xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#ffffff"
 android:gravity="center"
 android:orientation="vertical">

 <!--图片-->
 <imageview
  android:id="@+id/iv_dial"
  android:layout_width="200dp"
  android:layout_height="200dp"
  android:src="@drawable/img"/>

 <!--控制按钮-->
 <linearlayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="bottom"
  android:gravity="center"
  android:orientation="horizontal">

  <button
   android:id="@+id/btn_start"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="开始"/>

  <button
   android:id="@+id/btn_end"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="结束"/>

 </linearlayout>

</linearlayout>

也可以用其它的view控件替代imageview,都是可以实现摇摆效果的

主界面mainactivity

/**
 * 主界面
 * created by zhuwentao on 2016-08-08.
 */
public class mainactivity extends appcompatactivity implements view.onclicklistener{

 /** 表盘图片 */
 private imageview mdialiv;

 /** 开始按钮 */
 private button mstartbtn;

 /** 结束按钮 */
 private button mendbtn;

 @override
 protected void oncreate(bundle savedinstancestate) {
  super.oncreate(savedinstancestate);
  setcontentview(r.layout.activity_main);
  initui();
  initlistener();
 }

 /**
  * 初始化ui
  */
 private void initui() {
  mdialiv = (imageview) findviewbyid(r.id.iv_dial);
  mstartbtn = (button) findviewbyid(r.id.btn_start);
  mendbtn = (button) findviewbyid(r.id.btn_end);
 }

 /**
  * 初始化监听
  */
 private void initlistener() {
  mstartbtn.setonclicklistener(this);
  mendbtn.setonclicklistener(this);
 }

 @override
 public void onclick(view v) {
  switch (v.getid()) {
   case r.id.btn_start:
    showanimation();
    break;
   case r.id.btn_end:
    mdialiv.clearanimation();
    break;
  }
 }

 /**
  * 设置动画
  */
 private void showanimation() {
  // 获取自定义动画实例
  customrotateanim rotateanim = customrotateanim.getcustomrotateanim();
  // 一次动画执行1秒
  rotateanim.setduration(1000);
  // 设置为循环播放
  rotateanim.setrepeatcount(-1);
  // 设置为匀速
  rotateanim.setinterpolator(new linearinterpolator());
  // 开始播放动画
  mdialiv.startanimation(rotateanim);
 }
}

setrepeatcount()设置的是重复播放动画的次数,-1是为了让它循环播放,setrepeatcount(0)代表的是执行一次,setrepeatcount(1)代表重复1次,即动画执行2次。
setinterpolator()方法是设置插值器,用来指定动画的效果,这里使用系统提供的linearinterpolator()匀速变化效果。

自定义的customrotateanim动画需要继承animation,这里只要实现它的initialize()和applytransformation()方法就好

/**
 * 左右摇摆动画
 * created by zhuwentao on 2016-08-08.
 */
public class customrotateanim extends animation {

 /** 控件宽 */
 private int mwidth;

 /** 控件高 */
 private int mheight;

 /** 实例 */
 private static customrotateanim rotateanim;

 /**
  * 获取动画实例
  * @return 实例
  */
 public static customrotateanim getcustomrotateanim() {
  if (null == rotateanim) {
   rotateanim = new customrotateanim();
  }
  return rotateanim;
 }

 @override
 public void initialize(int width, int height, int parentwidth, int parentheight) {
  this.mwidth = width;
  this.mheight = height;
  super.initialize(width, height, parentwidth, parentheight);
 }

 @override
 protected void applytransformation(float interpolatedtime, transformation t) {
  // 左右摇摆
  t.getmatrix().setrotate((float)(math.sin(interpolatedtime*math.pi*2)*50), mwidth/2, mheight/2);
  super.applytransformation(interpolatedtime, t);
 }
}

initialize(int width, int height, int parentwidth, int parentheight)中,width和height代表指定播放动画的view空间宽高,parentwidth和parentheight代表该view控件所在的父控件宽高。
我们需要使用当前view的宽高来确定摇摆的旋转点,所以在initialize中获取view控件的宽高。

applytransformation()方法是动画具体的实现方法,在系统绘制动画时会反复调用这个方法,每调用一次applytransformation()方法,其中的interpolatedtime参数都会改变一次,值从0到1递增,当interpolatedtime的值为1时则动画结束。
transformatio类是一个变换的矩阵,通过改变该矩阵就可以实现各种复杂的效果。
复写这个方法,在里面就可以实现我们自定义的动画效果了。