Android自定义Animation实现View摇摆效果
发布时间 - 2026-01-10 22:35:25 点击率:次使用自定义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
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
android nfc常用标签读取总结
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
Android实现代码画虚线边框背景效果
香港服务器租用每月最低只需15元?
想要更高端的建设网站,这些原则一定要坚持!
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
BootStrap整体框架之基础布局组件
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
如何用花生壳三步快速搭建专属网站?
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
Laravel怎么连接多个数据库_Laravel多数据库连接配置
java获取注册ip实例
如何在Tomcat中配置并部署网站项目?
Laravel如何优化应用性能?(缓存和优化命令)
如何在万网开始建站?分步指南解析
Laravel怎么使用Intervention Image库处理图片上传和缩放
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
如何在景安云服务器上绑定域名并配置虚拟主机?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
教你用AI润色文章,让你的文字表达更专业
Android中AutoCompleteTextView自动提示
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
制作旅游网站html,怎样注册旅游网站?
iOS UIView常见属性方法小结
Android自定义控件实现温度旋转按钮效果
微信h5制作网站有哪些,免费微信H5页面制作工具?
Laravel API资源类怎么用_Laravel API Resource数据转换
如何用低价快速搭建高质量网站?
如何在搬瓦工VPS快速搭建网站?
如何在香港免费服务器上快速搭建网站?
深圳网站制作的公司有哪些,dido官方网站?
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
jQuery 常见小例汇总
使用Dockerfile构建java web环境
如何在云指建站中生成FTP站点?
Python正则表达式进阶教程_复杂匹配与分组替换解析
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
香港服务器建站指南:免备案优势与SEO优化技巧全解析
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
Swift中循环语句中的转移语句 break 和 continue
如何在Windows 2008云服务器安全搭建网站?
微信小程序 配置文件详细介绍

