按钮点击效果,背景透明度变化。
继承Button,Button有点击效果。
继承LinearLayout,LinearLayout有点击效果。
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
@SuppressLint("AppCompatCustomView")
public class AnimButton extends Button {
private static final float FROM\_VALUE =1.0f;
private static final float TO\_VALUE =0.94f;
private static final float ALPHA\_VALUE =0.8f;
private AnimatorSetanimatorSet =new AnimatorSet();
public AnimButton(Context context) {
super(context);
init();
}
public AnimButton(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}
public AnimButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public AnimButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
setClickable(true);
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
if (visibility ==0) {
setAlpha(FROM\_VALUE);
setScaleX(FROM\_VALUE);
setScaleY(FROM\_VALUE);
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (isClickable() && isEnabled()) {
if (event.getAction() == MotionEvent.ACTION\_DOWN) {
animOne(this);
}else if (event.getAction() == MotionEvent.ACTION\_UP) {
animNormal(this);
}else if (event.getAction() == MotionEvent.ACTION\_CANCEL) {
animNormal(this);
}
}
return super.onTouchEvent(event);
}
private void animNormal(View view) {
animatorSet.setDuration(250);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", TO\_VALUE, FROM\_VALUE);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", TO\_VALUE, FROM\_VALUE);
ObjectAnimator alpha = ObjectAnimator.ofFloat(view, "alpha", ALPHA\_VALUE, FROM\_VALUE);
animatorSet.play(scaleX).with(scaleY).with(alpha);
animatorSet.start();
}
private void animOne(View view) {
animatorSet.setDuration(200);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", FROM\_VALUE, TO\_VALUE);
ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", FROM\_VALUE, TO\_VALUE);
ObjectAnimator alpha = ObjectAnimator.ofFloat(view, "alpha", FROM\_VALUE, ALPHA\_VALUE);
animatorSet.play(scaleX).with(scaleY).with(alpha);
animatorSet.start();
}
}
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
全套视频资料:
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓
![](https://i-blog.csdnimg.cn/blog_migrate/7630be5330a3b9744b75b8e5c89dddb6.png)