anim_dialog

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();
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值