Android 控件位移动画
程序员文章站
2022-07-14 17:42:09
...
前面分享了一些开源动画,又是引用库,又是设置一些东西,但是在实际项目运用中多多少少还是有些出入的。不过没关系,人家大神的创作的思想是没毛病的,咱可以看看效果然后自己去写一个。可能我个人比较懒,就喜欢工具类,点一个方法就搞定。
老规矩,做记录,闲话不多说!先来看看效果
这是一个位移动画,到项目中还是实用的,可以自行UI修改处理。
上代码
一、弹出动画(不管它从哪里弹出,反正就是可以上下左右弹出)
private void showAnimation() {
//获取View初始化后的高度
height = dp2px(view.getHeight());
//前2个参数是X轴(就是横向位移)
//第一个参数是进入(弹出)第二个参数是退出
//后2个参数Y轴(就是纵向位移)参数同上
Animation animation = new TranslateAnimation(-height, 0, 0, 0);
animation.setDuration(1000);//动画从开始到结束执行的时间
animation.setFillAfter(true);//设置为true,动画转化结束后被应用
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.i("动画1","Start");
}
@Override
public void onAnimationEnd(Animation animation) {
animation.cancel();
isShowAnimation = true;
Log.i("动画1","End");
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
view.startAnimation(animation);//开始动画
}
二、退出动画(从哪里来,回那里去)
private void hideAnimation(){
height = dp2px(recyclerView.getHeight());
//同样的代码唯一的改动在参数这里
Animation animation = new TranslateAnimation(0, -height, 0, 0);
animation.setDuration(1000);
animation.setFillAfter(true);//设置为true,动画转化结束后被应用
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.i("动画2","Start2");
}
@Override
public void onAnimationEnd(Animation animation) {
Log.i("动画2","End2");
isShowAnimation = false;
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
view.startAnimation(animation);//开始动画
}
其实上面的2个方法是可以优化的,只用一个方法就可以了,
//在这里可以加一个Boolean判断,然后改变一下这个参数即可,记得把对象要提出来作为全局对象
Animation animation = new TranslateAnimation(0, -height, 0, 0);
以下是简洁化后的完整Util代码
public class AnimationViewUtils {
private Context mContext;
private View mView;
private OnAnimationClickListener animationClickListener;
private boolean isShowAnimation;
private int height;
private Animation animation;
public AnimationViewUtils(Context context, View view) {
this.mContext = context;
this.mView = view;
}
public void executeAnimation() {
mView.setVisibility(View.VISIBLE);
height = dp2px(mView.getHeight());//获取初始化后的控件高度
if (!isShowAnimation) {
animation = new TranslateAnimation(-height, 0, 0, 0);
} else {
animation = new TranslateAnimation(0, -height, 0, 0);
}
animation.setDuration(1000);
animation.setFillAfter(true);//设置为true,动画转化结束后被应用
//动画监听
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (!isShowAnimation) {
isShowAnimation = true;
} else {
isShowAnimation = false;
mView.setVisibility(View.GONE);
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mView.startAnimation(animation);//开始动画
}
//如果有需要自行回调
public interface OnAnimationClickListener {
//参数(父组件,当前单击的View,单击的View的位置,数据)
void onShowAnimationEnd();
void onHideAnimationEnd();
}
public void setOnAnimationClickListener(OnAnimationClickListener clickListener) {
this.animationClickListener = clickListener;
}
//dp转像素
private int dp2px(int value) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, mContext.getResources().getDisplayMetrics());
}
}
当然,上面的的实例是一个左边弹出动画,到这里就结束了,如果想要顶部或者底部,修改
animation = new TranslateAnimation(-height, 0, 0, 0);这里面的参数即可
示例Demo
END
上一篇: leetcode解题之括号生成
下一篇: leetcode 括号生成c++