专栏首页Android知识点总结Android自定义控件之ToggleImageView

Android自定义控件之ToggleImageView

零、前言

自定义一个简单的小控件来解决切换按钮个小问题,不然写起来挺麻烦 特别是多图的情况,selector不能用,难道一张一张switch?

[1].点击时透明度变化
[2].若干个图片轮回切换
[3].自定义点击时动画

一、使用

0.引入依赖

已经发布到github了

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    
    dependencies {
        implementation 'com.github.toly1994328:ToggleImageView:0.02'
    }

1.双按钮使用

为了使用简单一点,直接给个初始化双按钮的方法

ctrl.initTwoButton(
        R.drawable.icon_start_3, v -> {
            //TODO 播放
        }, R.drawable.icon_stop_3, v -> {
            //TODO 停止
        });

2.多按钮的使用

当然两个按钮也适用

 player.setResIds(
         R.drawable.icon_play_single, R.drawable.icon_play_single_loop,
         R.drawable.icon_play_loop, R.drawable.icon_play_random);
         
 player.setOnToggleListener((view, idx) -> {
     switch (idx) {
         case 0:
             //TODO 单曲播放
             break;
         case 1:
             //TODO 单曲循环
             break;
         case 2:
             //TODO 循环播放
             break;
         case 3:
             //TODO 随机播放
             break;
     }
 });

3.添加自定义动画

只要传入一个Animator就行了,至于Animator动画,可以详见: Animator 家族使用指南

ObjectAnimator rotation = ObjectAnimator.ofFloat(ctrl, "rotation", 0f, 180f).setDuration(300);
ObjectAnimator rotationX = ObjectAnimator.ofFloat(ctrl, "rotationX", 0f, 180f).setDuration(300);
ObjectAnimator rotationY = ObjectAnimator.ofFloat(ctrl, "rotationY", 0f, 180f).setDuration(300);

ctrl.setAnimator(rotation,rotationX,rotationY);

二、代码实现

这个很简单,只是通过资源id列表和一个索引来切换图片,并添加一些效果 点击时执行动画,动画结束后执行对应的回调以及OnToggleListener

/**
 * 作者:张风捷特烈<br/>
 * 时间:2019/3/10/010:8:00<br/>
 * 邮箱:1981462002@qq.com<br/>
 * 说明:多图标切换器
 */
public class ToggleImageView extends android.support.v7.widget.AppCompatImageView {
    private static final String TAG = "ToggleImageView";
    private AnimatorSet mSet;//动画集合
    private List<Integer> mResIds;//图片资源id
    private List<OnClickListener> mListeners;
    private int mCurrentIdx;//当前位置
    private boolean isWithScale = true;//点击时是否略微缩放
    private Animator[] mAnimators;//自定义动画
    public ToggleImageView(Context context) {
        this(context, null);
    }
    public ToggleImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mResIds = new ArrayList<>();
        mListeners = new ArrayList<>();
        mSet = new AnimatorSet();
        //设置动画结束监听
        mSet.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                setImageResource(mResIds.get(mCurrentIdx));
                if (mListeners.size() > 0) {
                    mListeners.get(mCurrentIdx).onClick(ToggleImageView.this);
                }
                if (mOnToggleListener != null) {
                    mOnToggleListener.toggle(ToggleImageView.this, mCurrentIdx);
                }
                mCurrentIdx++;
                if (mCurrentIdx == mResIds.size()) {
                    mCurrentIdx = 0;
                }
            }
        });
    }
    public void setAnimator(Animator... animators) {
        mAnimators = animators;
    }
    public void setResIds(List<Integer> resIds) {
        mResIds = resIds;
        setImageResource(mResIds.get(mCurrentIdx));
        mCurrentIdx = 1;
    }
    /**
     * 初始化双按钮
     *
     * @param resFrom 第一状态
     * @param callBackFrom 第一状态器
     * @param resTo  第二状态
     * @param callBackTo 第二状态器
     */
    public void initTwoButton(int resFrom, OnClickListener callBackFrom, int resTo, OnClickListener callBackTo) {
        mResIds.add(resFrom);
        mResIds.add(resTo);
        mListeners.add(callBackFrom);
        mListeners.add(callBackTo);
        setImageResource(mResIds.get(mCurrentIdx));
        mCurrentIdx = 1;
    }
    /**
     * 是否有缩放效果
     * @param withScale 默认true
     */
    public void setWithScale(boolean withScale) {
        isWithScale = withScale;
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                ObjectAnimator alpha = ObjectAnimator.ofFloat(this, "alpha", 1f, .1f, 1f).setDuration(300);
                mSet.play(alpha);
                if (isWithScale) {
                    ObjectAnimator scaleX = ObjectAnimator.ofFloat(this, "scaleX", 1f, .8f, 1f).setDuration(300);
                    ObjectAnimator scaleY = ObjectAnimator.ofFloat(this, "scaleY", 1f, .8f, 1f).setDuration(300);
                    mSet.play(scaleX).with(scaleY);
                }
                mSet.playTogether(mAnimators);
                mSet.start();
                break;
        }
        return super.onTouchEvent(event);
    }
    //监听
    public interface OnToggleListener {
        void toggle(View view, int currId);
    }
    private OnToggleListener mOnToggleListener;
    public void setOnToggleListener(OnToggleListener onToggleListener) {
        mOnToggleListener = onToggleListener;
    }
}

比较简单,源码地址:toly1994328/BiggerView

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • [-综合篇-] 相机、OpenGL、视频、Flutter和SurfaceView

    认识一个类,相当于结交一位朋友;看一篇源码,相当于一次顶级的会话; 读一个框架,相当于见证一段思想;做一个程序,相当于创造一个生命; 一次Git提交,相当于...

    张风捷特烈
  • Android多媒体之视频播放器(基于MediaPlayer)

    获取帧.png 基本上也就这么多了,最后讲一下视频封面帧图片的获取:数了一下这帧大概在15秒 测试了一下秒数越大,获取图片的速度越慢,也就是越卡,所以还是给0...

    张风捷特烈
  • Android多媒体之认识声音、录音与播放(PCM)

    张风捷特烈
  • Java之解析Excel设计详解

    前面几篇我们简单介绍了解析excel,这回是来讲解如何设计一个关于Excel操作的简单工具类,并将每一行数据传化成javabean的形式来进行使用。

    23号杂货铺
  • 论漫威丨缺乏历史底蕴的美国人,给我们带来了见证历史的超级英雄

    《复联3》即将于本周五在国内上映,但看到某影评网站已经超过两万条的评价,相信很多人早已被剧透的七七八八了吧?因此,今天小编也不打算就剧情与大家深入探讨。接下来,...

    VRPinea
  • 论漫威英雄丨打打杀杀还没看腻?背后的隐喻你都了解吗?

    VRPinea
  • 美团机器学习算法岗实习四面面经(推荐系统方向)

    “ 本篇内容为师妹在美团面试时的相关记录,希望对目前学习推荐系统方向的朋友们一些方向指引,同时也希望对寻找推荐系统相关工作的朋友们一些借鉴意义。如有相关问题,请...

    张小磊
  • BlockStack身份授权流程

    去中心化身份的前提条件,是在同一个身份平台所能覆盖的范围内,用户的身份识别和检测标准统一,作为区块链应用开发基础设施的服务提供商,BlockStack 在数据权...

    rectinajh
  • sarama消费kafka协议版本问题

    kafka作为消息队列,go消费数据常用的库,有sarama包和其扩展sarama-cluster。 https://github.com/Shopify/sa...

    用户1073218
  • 聊聊rocketmq的NettyClientConfig

    org/apache/rocketmq/remoting/netty/NettyClientConfig.java

    codecraft

扫码关注云+社区

领取腾讯云代金券