view动画
其中,我们最常用的是后两个,现在主要想说明一下我对后两个函数参数的理解。
先说第二个构造函数:TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, floattoYDelta)。
Delta,顾名思义表示的是一个后一个和前一个的差值。XDelta即表示在X方向上的差值,同理YDelta表示在Y方向的差值。若XDelta>0,则说明控件向右侧发生移动,否则向左侧移动,Y轴方向是相同的道理。现在来说下各个参数的意思:
fromXDelta:控件的开始移动前的位置,为什么是Delta呢?因为在此之前,该控件可能已经发生过了位移,因此它已经偏离了控件最初始的位置。因此采用了距离最初始位置的偏移量。
toXDelta:相同道理,想要移动的终点位置距离最初始位置的偏移量。记住,一定不要混淆的是,不要把这个最初始位置当成是移动开始前控件的位置,否则将会发生错误移动。
后面两个参数表示Y方向上的,和X方向上的同理。需要说明的是,这个是绝对偏移量,是以像素为单位进行计算的。
再来说说第三个构造函数。
当X方向或者Y方向上的Type选择为Animation.ABSOLUTE时候,表示为绝对像素,此时XValue和YValue参数的含义和第二个构造函数相同。
而当X方向或者Y方向上的Type选择为Animation.RELATIVE_TO_SELF或者 Animation.RELATIVE_TO_PARENT时候,则表示相位移量了,举个例子来说,如果在X方向上选择Animation.RELATIVE_TO_SELF,那么当XValue=1.0f时,则偏移量为一个自身宽度。如果在X方向上选择Animation.RELATIVE_TO_PARENT时,则偏移量为一个父控件宽度。Y方向是相同的道理,只是把宽度换成了高度而已。
自定义dialog进入退出动画
要和view动画结合起来, 属性动画是不合适的,
举个例子了
import android.animation.ObjectAnimator;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.Arrays;
/**
* Author: Created by benjamin
* DATE : 2018/4/2 17:19
* versionCode: v2.2
*/
public class CustomDialog extends Dialog implements View.OnClickListener {
private static final String TAG = "BudsEarningsWithdrawDia";
private Context mContext;
private View mContentView;
private FrameLayout.LayoutParams mContentViewLayoutParams;
private FrameLayout mFLRoot;
private TextView tvCancel;
private TextView tvConfirmed;
private TextView tvDesc;
public CustomDialog(@NonNull Context context) {
this(context, R.style.style_dialog_buds_earnings_withdraw);
mContext = context;
}
public CustomDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mFLRoot = new FrameLayout(getContext());
setContentView(mFLRoot);
WindowManager.LayoutParams params = getWindow().getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
getWindow().setAttributes(params);
initView();
initListener();
}
private void initView() {
mContentView = LayoutInflater.from(mContext).inflate(R.layout.dwl_dialog_buds_earings_withdraw, null);
mFLRoot.addView(mContentView);
mContentViewLayoutParams = (FrameLayout.LayoutParams) mContentView.getLayoutParams();
mContentViewLayoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
mContentViewLayoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
mContentViewLayoutParams.gravity = Gravity.CENTER;
mContentView.setLayoutParams(mContentViewLayoutParams);
}
private void initListener() {
mContentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
int[] outLocation = new int[2];
mContentView.getLocationOnScreen(outLocation);
int measuredHeight = mContentView.getMeasuredHeight();
int dy = measuredHeight + outLocation[1];
// TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, -dy, 0);
TranslateAnimation translateAnimation = new TranslateAnimation(Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, -dy,
Animation.ABSOLUTE, 0); // 两种构造都可以,不过第一种简单啦
translateAnimation.setDuration(200);
mContentView.clearAnimation();
mContentView.setAnimation(translateAnimation);
translateAnimation.start();
mContentView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
});
tvCancel.setOnClickListener(this);
tvConfirmed.setOnClickListener(this);
}
@Override
public void onBackPressed() {
super.onBackPressed();
}
@Override
public void dismiss() {
int[] outLocation = new int[2];
mContentView.getLocationOnScreen(outLocation);
int heightPixels = getContext().getResources().getDisplayMetrics().heightPixels;
int dy = heightPixels - outLocation[1];
// TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, dy);
TranslateAnimation translateAnimation = new TranslateAnimation(Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, dy); // 两种构造都可以,不过第一种简单啦
translateAnimation.setDuration(200);
translateAnimation.setFillAfter(true);
mContentView.clearAnimation();
mContentView.setAnimation(translateAnimation);
translateAnimation.start();
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
superDismiss();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
private void superDismiss() {
super.dismiss();
}
@Override
public void onClick(View v) {
int vId = v.getId();
if (vId == R.id.tv_cancel) {
dismiss();
} else if (vId == R.id.tv_confirmed) {
dismiss();
}
}
}