属性アニメーションを使用して、コントロールのレイアウト位置を動的に変更します.


  • 属性のアニメーションはみんなが使うのが多くなりました.ここでは自分の使った知識を直接重点的に話します.
  • ここでは主にコードの中で属性アニメーションでコントロールの配置を動的に変更する方法について話しています.
  • 私たちのプロジェクトはxmlが使えないので、一部のコントロールは連続的に位置を変えます.
  • ここでは、
  • を参照してください.
  • は、まず属性アニメーションの簡単な使用です.
  • はバートンをもとの5倍に大きくしましたが、大きくなり、縮小したり、並進したりしてこそ、私たちが欲しい位置に来ます.
  •  AnimatorSet set = new AnimatorSet();
            set.playTogether(
                    ObjectAnimator.ofFloat(mButton , "scaleX" , 1f , 5f ),
                    ObjectAnimator.ofFloat(mButton , "scaleY" , 1f , 5f )
    
            );
            set.setDuration(2000).start();
  • ここに大神さんのブログがあります.
  • 時ここは
  • です.
  • 上記の問題に対して、Googleは3つの解決方法があると教えてくれます.
  • あなたの対象にgetとset方法を加えて、もし権限があれば
  • 元のオブジェクトを1つのクラスで包装し、間接的にgetおよびset方法
  • を提供する.
  • Value Animationを採用して、アニメーションの過程を監督して、自分で属性の変化を実現します.
  • ここで直接に第二の方法を使う(任玉剛大神によって拡張される0.0)
  • は、Viewrapperを使って間接的にgetとsetの方法を提供することができる以上、他の方法を提供することができる.例えば、get Left Margin、setLeft Marginといったように、エッジがあれば、直接にコントロールの配置中の位置を設定することができます.
  • ここはViewrapperのコードです.中にも小さな傷があります.
    public class ViewWrapper {
        private View mTarget ;
    
        //   params            params!!
        //                params,        ,   params      mParams.leftMargin 。。     !!
        private RelativeLayout.LayoutParams mParams ; 
    
        private int mLeftMargin ;
    
        public ViewWrapper(View target) {
            mTarget = target;
            mParams = (RelativeLayout.LayoutParams) mTarget.getLayoutParams();
        }
        //     
        public int getWidth(){
            return mTarget.getLayoutParams().width;
        }
        public int getHeight(){
            return mTarget.getLayoutParams().height;
        }
        public void setWidth(int width){
            mTarget.getLayoutParams().width = width ;
            mTarget.requestLayout();
        }
        public void setHeight(int height){
            mTarget.getLayoutParams().height = height ;
            mTarget.requestLayout();
        }
    
        //       
        public int getLeftMargin(){
            return mParams.leftMargin ;
        }
        //         ,      
        public void setLeftMargin(int leftMargin ){
           mLeftMargin = leftMargin;
        }
    
        public int getTopMargin(){
            return mParams.topMargin ;
        }
        //                       。           ,            !!
        public void setTopMargin(int topMargin){
            mParams.setMargins( mLeftMargin  , topMargin  , 0 , 0 );
            mTarget.setLayoutParams(mParams);
            mTarget.requestLayout();
        }
    }
  • そして使うところで
  • を使いました.
     mButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mButton.post(new Runnable() {
                        @Override
                        public void run() {
                            mWidth = mButton.getWidth();
                            mHeight = mButton.getHeight();
                            changeBigSmall(mButton);
                        }
                    });
    
                }
            });
    
    //          
    // ObjectAnimator.ofInt(wrapper, "width", mWidth , mWidth + 60 ),         !   viewWrap   get 、 set       !(      ,    )
       private void changeBigSmall(View view) {
            if (view == null) return;
    
            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) view.getLayoutParams();
            int leftMargin = params.leftMargin;
            int topMargin = params.topMargin;
    
            AnimatorSet set = new AnimatorSet();
            ViewWrapper wrapper = new ViewWrapper(view);
            set.playTogether(
                    ObjectAnimator.ofInt(wrapper, "width", mWidth , mWidth + 60 ),
                    ObjectAnimator.ofInt(wrapper, "height", mHeight , mHeight + 60),
                    ObjectAnimator.ofInt(wrapper, "leftMargin", leftMargin , leftMargin + 50 ),
                    ObjectAnimator.ofInt(wrapper, "topMargin", topMargin , topMargin + 50)//       ,     viewWrap       
            );
            set.setDuration(2000).start();
    
        }
    
  • ここでは小さなアイデアだけを提供しています.必ずしも完璧ではなく、直接にmParames.setMaginsに来てもいいです.直接位置を設定してください.
  • もちろん一般的には、直接属性アニメーションを使う必要はありません!直接に父の配置のmParaams.set Margins(aa,bb,ccc,ddd)を使えばいいです.どこから来たのがそんなに面倒ですか?