按钮按下透明度变化
因为工作的关系,常常面临需要设计点击某个控件具有按下透明度变化的需求。
例如:
制\点击透明度变化.gif)可能图片有点模糊,但是大概就是在点击的时候,有明显按下的感觉,现在的处理方案有:
-
叫设计师多做一张图片,然后将两张图片做成同一个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> 复制代码
-
或者你可以使用自定义控件,例如:
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事件永远被拦截,所以这里会导致问题,但是在这里其实也是可以实现该功能的。
-
也是实现自定义控件,只是实现的方式有所变化
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; } 复制代码
这样就可以解决问题了。也不用让设计师多给张图片了。
目前在工作中遇到的连续点击的只能间隔一定的时间响应
-
目前采用的方式是:
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; } } 复制代码
-
之后了解到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 的集成
-
截止目前为止最新版本,我印象中最好用的svg加载框架是lottie,版本为: 2.8.0
- 在集成的过程中有几个需要注意的点
- 翻墙
- 如果项目不支持28.x.x的编译,我自己的项目采用的是27.1.1
- 如果项目compileSdkVersion 和buildToolsVersion不支持28,我自己是22,
- Lottie 2.8.0 and above only supports projects that have been migrated to androidx
- 如果2,3条件不满足,建议都不要使用2.8.0,使用2.7.0的版本即可。
- 在集成的过程中有几个需要注意的点
-
如果在集成的过程中老师说某个资源找不到,建议降低lottie的版本号进行重试。
-
使用的方式很简单:
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();//暂停动画 复制代码
-
周总结:
- 多去浏览github,怎么浏览?可以看下知乎
- 昨天张哥在星球直播说看好在线直播,知识付费就是一种形式。建议大家不要对网上授课的持抵触情绪,怀着试一试的心态进行尝试。【当然要先对自己有用】比方说,我对学习经济学感兴趣,我会去《得到》上学习薛兆丰的经济学。
- 因为我是程序猿,所以说话对于我,平时表现不多,而且最重要的是,不会好好说话,最近我也经常因为说错话导致,一些尴尬。所以我买了《好好说话》
- 张哥也说了,要抱着持续且虚心学习的心,才能够厚积薄发。
- 不要排斥别人对你的推荐,当然要分清楚,对方所处的位置,就是换位思考。
- 自己的事项安排,希望是对自己的一种目标。“立长志,常立志”
- 因为得到的薛兆丰我是今年年初才买的,【而他是2017年的时候就开始演讲了,这就是我落后了别人的地方啊】所以每天都要听至少两节课,并总结。
- 好好说话,也是2017年的东西,现在都第二季了,我才开始听第一季的东西,每天上班的路上听听,增长自己的情商以及说话之道
- 英语听力,这是我觉得真的需要弥补的一个东西,我现在才开始听VOA【不管你信不信,这就是我,听力很差的,当然四级差几分才及格】
- 知识星球,每天看看上面的评论与发言,看看不同的人的不同看法。【当然在于自己的吸收能力了】【商人也不过是在打资讯的差异,以前是地域限制资讯差别,现在是思维限制资讯差别】
- 专业技能,我也会在极客时间上面买课程,我买的不多,因为我觉得每天除了工作的时间,剩下的时间真的没有多少,有一句话我觉得很对【程序员9点下班,那不是加班,是正常下班】,每天我回到家里,大概10点20分左右,android程序员我真心觉得《张绍峰的android课程》不错
- 平常可以看看知乎,【我是一个三观有点不正的人,这也是慢慢接触之后才发现的,这是真心话】
- 听听歌,看看美剧。