Android圆形头像轮播闪动实现
Android圆形头像轮播闪动实现
项目中需要使用头像可以循环轮播的效果,哈哈,啥也不说,先上效果图,
不要看例子花里胡哨的,其实只是中间那四个头像啊!单独抽出来是右边这样的图片效果,这里是搞了个按钮开启自动更新的任务。
要想使用自动轮播头像闪动,首先需要圆形的头像,这个圆形的头像图片使用的是一个叫CircleImageView的开源控件,大家可以参考下面这篇博客,
写的已经非常清晰了,他就是一个CircleImageView.java文件,复制过来这个java文件和一个arrrs.xml文件就可以使用了,目的是将我们提供的各种形状的图片替换成圆形的头像。
具体实现,先看下布局文件,很简单,就是四个上面使用的控件,四个CircleImageView,就这样,木有了:(请忽略这四个图片的名字,太乱了,不想改了o(╥﹏╥)o)
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android=""xmlns:app=""android:id="@+id/ly_root"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="60dp"android:background="@color/light"><com.example.fake_hago_2.view.CircleImageViewandroid:id="@+id/top_2"android:layout_width="50dp"android:layout_height="50dp"android:layout_toLeftOf="@+id/top_img"android:layout_marginRight="7dp"android:layout_centerInParent="true"android:src="@drawable/pic2"app:civ_border_width="2dp"app:civ_border_color="@color/light" /><com.example.fake_hago_2.view.CircleImageViewandroid:id="@+id/top_img"android:layout_width="50dp"android:layout_height="50dp"android:layout_centerInParent="true"android:src="@drawable/hugh"android:layout_marginRight="7dp"app:civ_border_width="2dp"app:civ_border_color="@color/light" /><com.example.fake_hago_2.view.CircleImageViewandroid:id="@+id/top_3"android:layout_width="50dp"android:layout_height="50dp"android:layout_toRightOf="@+id/top_img"android:layout_marginRight="7dp"android:layout_centerInParent="true"android:src="@drawable/pic3"app:civ_border_width="2dp"app:civ_border_color="@color/light" /><com.example.fake_hago_2.view.CircleImageViewandroid:id="@+id/top_4"android:layout_width="50dp"android:layout_height="50dp"android:layout_centerInParent="true"android:layout_toRightOf="@+id/top_3"android:src="@drawable/pic4"app:civ_border_width="2dp"app:civ_border_color="@color/light" /></RelativeLayout></merge>
接下来要自定义布局啦,我们继承RelativeLayout,然后重写初始化函数,在bindView()里面find到我们的每一个ImageView的Id,因为需要单独控制每个ImageView图片播放动画的时机,这样才有四个图片挨个播放的效果,具体的实现就是从MainActivity中启动我们这个自定义View的函数startFlashAvaterTask(),里面定义一个TimerTask,这个Task每隔两秒,发送四个之间间隔100毫秒的消息,交个Handler处理,handler根据接收到消息的先后顺序去开始四个ImageView各自的动画,大致逻辑就是这样子,具体看代码吧,注释写的比较清楚了:
public class FlashAvaterView extends RelativeLayout{private ImageView top_2;private ImageView top_3;private ImageView top_4;private ImageView mTopImg;private Timer mTimer;private long mIntervalTime = 0;private volatile boolean isRun = true;private static class AnimHandler extends Handler {}//不同时间间隔接受到的消息,播放对应的View的动画private AnimHandler mHandler = new AnimHandler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 0) {scaleAnimator(top_2);} else if (msg.what == 1) {scaleAnimator(mTopImg);} else if (msg.what == 2) {scaleAnimator(top_3);} else if (msg.what == 3) {scaleAnimator(top_4);}super.handleMessage(msg);}};public FlashAvaterView(Context context) {this(context, null);}public FlashAvaterView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public FlashAvaterView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);bindViews(context);}private void bindViews(Context context) {LayoutInflater.from(context).inflate(R.layout.flash_avater_view, this, true);if (mTimer == null) {mTimer = new Timer();}top_2 = (CircleImageView) findViewById(R.id.top_2);mTopImg = (CircleImageView) findViewById(R.id.top_img);top_3 = (CircleImageView) findViewById(R.id.top_3);top_4 = (CircleImageView) findViewById(R.id.top_4);}//启动轮播任务的时间点public void startFlashAvaterTask(long time) {if (mTimer == null) {mTimer = new Timer();} else {if (isRun) {mTimer.scheduleAtFixedRate(new MyTask(), 1, 2000);isRun = false;}}}//由于需要四个头像之间播放也有先后顺序,因此设置一个时间间隔,间隔mIntervalTime发送消息给handlerprivate class MyTask extends TimerTask {@Overridepublic void run() {for (int i = 0 ; i < 4; i++) {mIntervalTime += 100;mHandler.sendEmptyMessageDelayed(i, mIntervalTime);}}}//缩小、放大的动画private void scaleAnimator(final ImageView img){final float scale = 0f;AnimatorSet scaleSet = new AnimatorSet();ValueAnimator valueAnimatorSmall = ValueAnimator.ofFloat(1.0f, scale);valueAnimatorSmall.setDuration(200);ValueAnimator valueAnimatorLarge = ValueAnimator.ofFloat(scale, 1.0f);valueAnimatorLarge.setDuration(200);valueAnimatorSmall.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float scale = (Float) animation.getAnimatedValue();img.setScaleX(scale);img.setScaleY(scale);}});valueAnimatorLarge.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float scale = (Float) animation.getAnimatedValue();img.setScaleX(scale);img.setScaleY(scale);}});scaleSet.play(valueAnimatorSmall).before(valueAnimatorLarge);scaleSet.start();}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();}
}
具体怎个用法就很简单了,在XML布局文件中引入这个FlashAvaterView,然后findViewById(),和使用普通控件一样了:
xml中引入:
<com.example.fake_hago_2.view.FlashAvaterViewandroid:id="@+id/flash_avater"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal" />
java中find它:
FlashAvaterView flashAvaterView = (FlashAvaterView) helper.getView(R.id.flash_avater);
flashAvaterView.startFlashAvaterTask(3000);
项目完整的地址:
- 南宁市计算机技术专业学校,南宁电脑技术学校有哪些
- 用php调用接口api
- 关于NullPointerException的小实例
- 自定义注解实现RBAC权限校验,不要再说你不会了
- linux驱动
- MinGW+MSYS安装
- 梯度下降法和最速下降法区别
- IIS网站安全设置
- 回溯算法 允许重复选择元素的组合
- linux下HTK安装说明
- mmap()
- ADFS 概念与基本开发介绍
- YumRepo Error: All mirror URLs are not using ftp, http[s] or file解决办法
- 网上订餐系统1
- 【网络流量监控工具之Nethogs】
- C语言模拟实现:atoi函数
- JavaScript弹出框、对话框、提示框、弹窗总结
- Shiro登录的使用以及原理(一)
- DBCC
- socat 虚拟串口在 linux OS中如何实现?