全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

使用自定义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类是一个变换的矩阵,通过改变该矩阵就可以实现各种复杂的效果。
复写这个方法,在里面就可以实现我们自定义的动画效果了。


# Android  # Animation  # 摇摆  # Android Animation实战之一个APP的ListView的动画效果  # Android使用glide加载gif动画设置播放次数  # Android Glide图片加载(加载监听、加载动画)  # Android实现跳动的小球加载动画效果  # Android自定义加载loading view动画组件  # Android自定义加载控件实现数据加载动画  # Android加载Gif动画实现代码  # Android自定义view实现阻尼效果的加载动画  # Android自定义View实现loading动画加载效果  # Android使用View Animation实现动画加载界面  # 自定义  # 的是  # 左右摇摆  # 设置为  # 就可以  # 都是  # 是一个  # 就好  # 可以用  # 很简单  # 在里面  # 可以实现  # 让它  # 值为  # 如图所示  # 时则  # 是为了  # 插值  # dp  # drawable 


相关文章: 完全自定义免费建站平台:主题模板在线生成一站式服务  网站微信制作软件,如何制作微信链接?  如何选择高性价比服务器搭建个人网站?  如何破解联通资金短缺导致的基站建设难题?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何设置并定期更换建站之星安全管理员密码?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  建站之星IIS配置教程:代码生成技巧与站点搭建指南  如何通过免费商城建站系统源码自定义网站主题与功能?  智能起名网站制作软件有哪些,制作logo的软件?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  微信小程序 input输入框控件详解及实例(多种示例)  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  高防服务器租用首荐平台,企业级优惠套餐快速部署  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  如何通过多用户协作模板快速搭建高效企业网站?  如何在Tomcat中配置并部署网站项目?  如何在阿里云完成域名注册与建站?  高端企业智能建站程序:SEO优化与响应式模板定制开发  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  详解jQuery中基本的动画方法  微课制作网站有哪些,微课网怎么进?  如何在腾讯云服务器快速搭建个人网站?  制作电商网页,电商供应链怎么做?  油猴 教程,油猴搜脚本为什么会网页无法显示?  网站图片在线制作软件,怎么在图片上做链接?  ,sp开头的版面叫什么?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  Android自定义控件实现温度旋转按钮效果  网站制作公司排行榜,抖音怎样做个人官方网站  如何确保西部建站助手FTP传输的安全性?  安云自助建站系统如何快速提升SEO排名?  网站制作公司,橙子建站是合法的吗?  番禺网站制作公司哪家值得合作,番禺图书馆新馆开放了吗?  微信推文制作网站有哪些,怎么做微信推文,急?  如何通过NAT技术实现内网高效建站?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  公众号网站制作网页,微信公众号怎么制作?  实例解析angularjs的filter过滤器  动图在线制作网站有哪些,滑动动图图集怎么做?  Swift开发中switch语句值绑定模式  浅谈Javascript中的Label语句  建站VPS能否同时实现高效与安全翻墙?  一键网站制作软件,义乌购一件代发流程?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  在线制作视频网站免费,都有哪些好的动漫网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。