按下透明度变化控件实现,svg集成,周结

按钮按下透明度变化

因为工作的关系,常常面临需要设计点击某个控件具有按下透明度变化的需求。

例如:

制\点击透明度变化.gif)

可能图片有点模糊,但是大概就是在点击的时候,有明显按下的感觉,现在的处理方案有:

  1. 叫设计师多做一张图片,然后将两张图片做成同一个drawable来处理,例如这样

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <item android:drawable="@drawable/shape_exit_round_rectangle_pressed" android:state_pressed="true"/>
        <item android:drawable="@drawable/shape_exit_round_rectangle_normal" />
    
    </selector>
    复制代码
  2. 或者你可以使用自定义控件,例如:

    public class AlphaImageView extends android.support.v7.widget.AppCompatImageView {
    
        public AlphaImageView(Context context) {
            super(context);
        }
    
        public AlphaImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public AlphaImageView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            boolean intercept = super.onTouchEvent(event);
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    setAlpha(0.5f);
                    intercept = true;
                    break;
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    setAlpha(1f);
                    break;
                default:
                    break;
            }
            return intercept;
        }
    }
    复制代码

    细心的同学会发现,这样会导致click事件永远被拦截,所以这里会导致问题,但是在这里其实也是可以实现该功能的。

  3. 也是实现自定义控件,只是实现的方式有所变化

    
    public class ShadeImageView extends AppCompatImageView {
    	private float offsetX;
    	private float offsetY;
    	private long down;
    
    	public ShadeImageView(Context context, AttributeSet attrs) {
    		this(context, attrs, 0);
    	}
    
    	public ShadeImageView(Context context, AttributeSet attrs, int defStyle) {
    		super(context, attrs, defStyle);
    	}
    
    	public ShadeImageView(Context context) {
    		this(context, null);
    	}
    
    	@Override
    	public boolean onTouchEvent(MotionEvent event) {
    
    		switch (event.getAction()) {
    		case MotionEvent.ACTION_DOWN:
    			this.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
    			offsetX = event.getX();
    			offsetY = event.getY();
    			down = SystemClock.currentThreadTimeMillis();
    			return true;
    		case MotionEvent.ACTION_CANCEL:
    			this.clearColorFilter();
    			break;
    		case MotionEvent.ACTION_UP:
    			this.clearColorFilter();
    			if (mOnClickListener != null && SystemClock.currentThreadTimeMillis() - down < ViewConfiguration.getLongPressTimeout()) {
    				if (Math.abs(event.getX() - offsetX) < ViewConfiguration.getTouchSlop() && Math.abs(event.getY() - offsetY) < ViewConfiguration.getTouchSlop()) {
    					playSoundEffect(SoundEffectConstants.CLICK);
    					mOnClickListener.onClick(this);
    				}
    				return true;
    			}
    			break;
    		}
    
    		return false;
    	}
    
    	@Override
    	public void setOnClickListener(OnClickListener l) {
    		mOnClickListener = l;
    		super.setOnClickListener(l);
    	}
    
    	private OnClickListener mOnClickListener;
    
    }
    复制代码

    这样就可以解决问题了。也不用让设计师多给张图片了。

目前在工作中遇到的连续点击的只能间隔一定的时间响应
  1. 目前采用的方式是:

    public abstract class OnEffectiveClickListener implements View.OnClickListener {
        private long mLastClickTime;
    
        @Override
        public void onClick(View v) {
            long nowTime = SystemClock.elapsedRealtime();
            if (nowTime - mLastClickTime > getTimeInterval()) {
                onEffectiveClick(v);
                mLastClickTime = nowTime;
            }
        }
    
        public abstract void onEffectiveClick(View v);
    
        /**
         * 返回两次点击的时间必须大于多少毫秒
         *
         * @return 时间间隔 单位ms
         */
        public long getTimeInterval() {
            return 500;
        }
    }
    复制代码
  2. 之后了解到Rxjava2其实就可以做这个事情的。

    采用throttleFirst就可以解决这个问题

    Observable.create(new ObservableOnSubscribe<Integer>() {
    			@Override
    			public void subscribe(ObservableEmitter<Integer> e) throws Exception {
    				thisEmitter = e;
    			}
    		})// 1s只响应一次点击
    				.throttleFirst(1, TimeUnit.SECONDS).subscribe();
    		
            //使用的方式是:
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    thisEmitter.onNext(1);
                }
            });
    
    复制代码
    SVG 的集成
    1. 截止目前为止最新版本,我印象中最好用的svg加载框架是lottie,版本为: 2.8.0

      1. 在集成的过程中有几个需要注意的点
        1. 翻墙
        2. 如果项目不支持28.x.x的编译,我自己的项目采用的是27.1.1
        3. 如果项目compileSdkVersion 和buildToolsVersion不支持28,我自己是22,
        4. Lottie 2.8.0 and above only supports projects that have been migrated to androidx
        5. 如果2,3条件不满足,建议都不要使用2.8.0,使用2.7.0的版本即可。
    2. 如果在集成的过程中老师说某个资源找不到,建议降低lottie的版本号进行重试。

    3. 使用的方式很简单:

      dependencies {
      	implementation 'com.airbnb.android:lottie:2.7.0'
      }
      复制代码
      <!--其中的playing.json文件需要放置在src/main/assets文件夹下-->
      <com.airbnb.lottie.LottieAnimationView
                      android:id="@+id/iv_playing"
                      android:layout_width="@dimen/m32"
                      android:layout_height="@dimen/m32"
                      android:layout_gravity="center"
                      app:lottie_autoPlay="false"
                      app:lottie_fileName="playing.json"
                      app:lottie_loop="true" />
      复制代码
      ivPlaying.playAnimation(); //播放动画
      ivPlaying.pauseAnimation();//暂停动画
      复制代码
周总结:
  1. 多去浏览github,怎么浏览?可以看下知乎
  2. 昨天张哥在星球直播说看好在线直播,知识付费就是一种形式。建议大家不要对网上授课的持抵触情绪,怀着试一试的心态进行尝试。【当然要先对自己有用】比方说,我对学习经济学感兴趣,我会去《得到》上学习薛兆丰的经济学。
  3. 因为我是程序猿,所以说话对于我,平时表现不多,而且最重要的是,不会好好说话,最近我也经常因为说错话导致,一些尴尬。所以我买了《好好说话》
  4. 张哥也说了,要抱着持续且虚心学习的心,才能够厚积薄发。
  5. 不要排斥别人对你的推荐,当然要分清楚,对方所处的位置,就是换位思考。
  6. 自己的事项安排,希望是对自己的一种目标。“立长志,常立志”
    1. 因为得到的薛兆丰我是今年年初才买的,【而他是2017年的时候就开始演讲了,这就是我落后了别人的地方啊】所以每天都要听至少两节课,并总结。
    2. 好好说话,也是2017年的东西,现在都第二季了,我才开始听第一季的东西,每天上班的路上听听,增长自己的情商以及说话之道
    3. 英语听力,这是我觉得真的需要弥补的一个东西,我现在才开始听VOA【不管你信不信,这就是我,听力很差的,当然四级差几分才及格】
    4. 知识星球,每天看看上面的评论与发言,看看不同的人的不同看法。【当然在于自己的吸收能力了】【商人也不过是在打资讯的差异,以前是地域限制资讯差别,现在是思维限制资讯差别】
    5. 专业技能,我也会在极客时间上面买课程,我买的不多,因为我觉得每天除了工作的时间,剩下的时间真的没有多少,有一句话我觉得很对【程序员9点下班,那不是加班,是正常下班】,每天我回到家里,大概10点20分左右,android程序员我真心觉得《张绍峰的android课程》不错
    6. 平常可以看看知乎,【我是一个三观有点不正的人,这也是慢慢接触之后才发现的,这是真心话】
    7. 听听歌,看看美剧。

转载于:https://juejin.im/post/5c3af337e51d45518d46ce14

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值