Android基础——属性动画

anim中的

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="100%"
    android:toYDelta="0%"
    android:duration = "3000"
    >
</translate>

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="0%"
    android:toYDelta="-100%"
    android:duration = "3000"
    >

</translate>
animator中的

<?xml version="1.0" encoding="utf-8"?>

<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="rotationX"
    android:valueFrom="0"
    android:valueTo="720"
    android:valueType="floatType"
    android:duration="3000"
    />
<?xml version="1.0" encoding="utf-8"?>
<!--
    android:propertyName=""  属性名称

        属性名称:
            位移:  translationX  translationY
            旋转:  rotation    rotationX   rotationY
            缩放:  scaleX      scaleY
            透明:  alpha

    android:valueFrom=""     开始的值
    android:valueTo=""       结束的值
    android:valueType=""     值的类型
-->
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="scaleX"
    android:valueFrom="1.0"
    android:valueTo="3.0"
    android:valueType="floatType"
    android:duration="3000"
    >

</objectAnimator>
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:propertyName="scaleY"
    android:valueFrom="1.0"
    android:valueTo="3.0"
    android:valueType="floatType"
    android:duration="3000"
    >

</objectAnimator>
<?xml version="1.0" encoding="utf-8"?>
<!--
        android:ordering="sequentially" 集合动画的执行方式
                sequentially     依次执行her         一起执行
                toget
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together"
    >

    <!--缩放X-->
    <objectAnimator
        android:propertyName="scaleX"
        android:valueFrom="1"
        android:valueTo="3"
        android:valueType="floatType"
        android:duration="3000"
        />

    <!--缩放Y-->
    <objectAnimator
        android:propertyName="scaleY"
        android:valueFrom="1"
        android:valueTo="3"
        android:valueType="floatType"
        android:duration="3000"
        />


    <!--移动Y  向上-->
    <objectAnimator
        android:propertyName="translationY"
        android:valueFrom="0"
        android:valueTo="-1500"
        android:valueType="floatType"
        android:duration="3000"
        />
</set>
//主界面

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void onClick(View view) {



        switch (view.getId())
        {
            case R.id.but_01:

               Intent intent = new Intent(MainActivity.this, InfoActivity.class);
                startActivity(intent);

                //添加切换的动画  -- 补间动画  -- res/anim 文件夹
                //进入时的动画 -- InfoActivity, 退出时的动画 -- MainActivity
                overridePendingTransition(R.anim.enter_anim,R.anim.exit_anim);
                break;

            case R.id.but_02:
                startActivity(new Intent(this, TweenActivity.class));
                break;

            case R.id.but_03:
                startActivity(new Intent(this,PropertyActivity01.class));

                break;
            case  R.id.but_04:
                startActivity(new Intent(this, PropertyActivity02.class));
                break;
            case R.id.but_05:
                startActivity(new Intent(this, PropertyActivity03.class));
                break;
        }



    }
}

//补间效果

/**
 * 验证:  而补间动画, 更改的View 的绘制效果, 真正的属性依然保留在以前的位置上
 */
public class TweenActivity extends AppCompatActivity {

    private ImageView mIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tween);

        mIv = (ImageView) findViewById(R.id.iv_id);
        
        mIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(TweenActivity.this, "我是团子小可爱, 啦啦啦啦......", Toast.LENGTH_SHORT).show();
            }
        });
    }

    //点击按钮, 播放动画 --- 位移
    public void onClick(View view) {

        TranslateAnimation translateAnimation  = new TranslateAnimation(0,0,0,600);
        translateAnimation.setDuration(3000);
        translateAnimation.setFillAfter(true);
        mIv.startAnimation(translateAnimation);

    }
}

/**
 * 资源文件 , 创建属性动画
 *
 * 1, 在res 中 创建文件夹, animator 文件夹, 在该文件夹中, 创建xml 的文件
 *
 * 2, 在文件中创建动画
 *     单个动画 ---  <objectAnimator></objectAnimator>
 *     多个动画 ---  <set></set>
 *
 * 3, 在Activity 中加载动画
 *      3.1  加载动画资源
 *      ObjectAnimator animator = AnimatorInflater.loadAnimator(上下文对象, 动画资源的id);
 *      3.2  设置执行该动画的控件
 *      animator.setTarget(mIv);
 *      3.3  启动动画
 *      animator.start();
 */

public class PropertyActivity01 extends AppCompatActivity {

    private ImageView mIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_property01);

        mIv = (ImageView) findViewById(R.id.iv_id);
    }

    //点击播放动画
    public void onClick(View view) {

        switch (view.getId())
        {
            case R.id.but_01:
                //缩放X轴的动画
                //1, 加载动画资源  -- 通过动画加载器来加载
                ObjectAnimator scaleXAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.scale_x);
                //2, 设置执行该动画资源的控件
                scaleXAnimator.setTarget(mIv);
                //3, 启动动画
                scaleXAnimator.start();

                break;

            case R.id.but_02:
                //缩放Y轴的动画
                //1, 加载动画资源
                ObjectAnimator scaleYAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.scale_y);
                //2, 设置执行该动画的控件
                scaleYAnimator.setTarget(mIv);
                //3, 启动动画
                scaleYAnimator.start();
                break;

            case R.id.but_03:
                //旋转 X
                ObjectAnimator rotationAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.rotation_x);
                rotationAnimator.setTarget(mIv);
                rotationAnimator.start();

                //TODO 监听器一: 监听动画变化时的实时数据  addUpdateListener
                rotationAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {

                    }
                });

                //TODO 监听器二:监听动画改变时的状态  addListener
                rotationAnimator.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {

                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {

                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {

                    }
                });


                break;

            case R.id.but_04:
                //1, 加载动画资源
                Animator animator = AnimatorInflater.loadAnimator(this,R.animator.set_animator);
                //2, 设置显示动画的控件
                animator.setTarget(mIv);
                //3, 启动动画
                animator.start();

                break;
        }
    }
}

//定义动画

/**
 * 1, 定义动画对象
 * 执行动画的控件,  动画的属性名称 , 动画的属性值 -- 可变长度的数组
 *      属性名称:
 位移:  translationX  translationY
 旋转:  rotation    rotationX   rotationY
 缩放:  scaleX      scaleY
 透明:  alpha
 *  ObjectAnimator alpha =  ObjectAnimator.ofFloat(mIv,"alpha",1.0f,0.0f,1.0f);

 * 2, 设置动画的持续时间
 *  alpha.setDuration(5000);
 *  3, 启动动画
 *  alpha.start();
 */
public class PropertyActivity02 extends AppCompatActivity {

    private ImageView mIv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_property_actitivy02);

        mIv = (ImageView) findViewById(R.id.iv_id);
        
        mIv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(PropertyActivity02.this, "我在这里, 呵呵......", Toast.LENGTH_SHORT).show();
            }
        });
    }

    public void onClick(View view) {

        switch (view.getId())
        {
            case R.id.but_01:
                //渐变  -- 透明度
                //1, 定义动画
                //执行动画的控件,  动画的属性名称 , 动画的属性值 -- 可变长度的数组
                /**
                 * 属性名称:
                 位移:  translationX  translationY
                 旋转:  rotation    rotationX   rotationY
                 缩放:  scaleX      scaleY
                 透明:  alpha
                 */
                ObjectAnimator alpha =  ObjectAnimator.ofFloat(mIv,"alpha",1.0f,0.0f,1.0f);
                //2, 设置动画的持续时间
                alpha.setDuration(5000);
                //3, 启动动画
                alpha.start();

                break;
            case R.id.but_02:
                //缩放X
                //1, 定义动画
                ObjectAnimator scaleX = ObjectAnimator.ofFloat(mIv,"scaleX",1,3,1,3,1,3);
                //2, 设置动画的持续时间
                scaleX.setDuration(5000);
                //3, 启动动画
                scaleX.start();

                break;
            case R.id.but_03:
                //旋转
                //1, 创建动画
                ObjectAnimator rotation = ObjectAnimator.ofFloat(mIv,"rotation",0,360);
                //2, 设置动画的持续时间
                rotation.setDuration(5000);
                //3, 启动动画
                rotation.start();
                break;
            case R.id.but_04:
                //移动Y
                //1, 创建动画
                ObjectAnimator translationY = ObjectAnimator.ofFloat(mIv,"translationY",0,900,500,800,700);
                //2, 设置动画的持续时间
                translationY.setDuration(5000);
                //3, 启动动画
                translationY.start();
                break;
            case R.id.but_05:
                //集合
                //1, 创建集合对象
                AnimatorSet animatorSet = new AnimatorSet();

                //2, 创建每一个动画
                ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(mIv,"rotation",0,360);
                ObjectAnimator translationYAnimator = ObjectAnimator.ofFloat(mIv,"translationY",0,900);

                //3, 把单个动画添加到集合中
                //第一种方式
//                    List<Animator> list = new ArrayList<>();
//                    list.add(rotationAnimator);
//                    list.add(translationYAnimator);
//                    //animatorSet.playSequentially(list);//依次执行
//                    animatorSet.playTogether(list);//一起执行

                //第二种方式  -- 注意:  同一个动画, 只能被使用一次
                    animatorSet.play(rotationAnimator).with(translationYAnimator);

                //4, 设置持续时间
                animatorSet.setDuration(5000);

                //5, 启动动画
                animatorSet.start();
                break;

        }
    }
}
//第三个代码

public class PropertyActivity03 extends AppCompatActivity  implements View.OnClickListener{

    //所有的控件id
    private int[] ids = {R.id.img_a,R.id.img_b,R.id.img_c,R.id.img_d,R.id.img_e};
    private List<ImageView> views = new ArrayList<>();

    private boolean flag = true;// true : 当前点击按键, 弹出菜单 ;  false 当前点击按钮, 合并菜单


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_property03);

        //初始化控件
        for(int i=0;i<ids.length;i++)
        {
            ImageView iv = (ImageView) findViewById(ids[i]);
            iv.setOnClickListener(this);//为每个图片设置监听器
            views.add(iv);
        }
    }

    @Override
    public void onClick(View v) {

        switch (v.getId())
        {
            case R.id.img_a:
                if(flag)
                {
                    //打开菜单
                    startAnim();
                }
                else
                {
                    //合并菜单
                    stopAnim();
                }
                break;
            default:
                Toast.makeText(this, "当前点击的id ----"  + v.getId(), Toast.LENGTH_SHORT).show();
                break;
        }
    }
    //展开动画
    private void startAnim() {
        //位移 -- xy 一起移动 -- 集合
        for(int i = 1;i<views.size();i++)
        {
            AnimatorSet animatorSet = new AnimatorSet();

            //移动X
            ObjectAnimator animator_x = ObjectAnimator.ofFloat(views.get(i),"translationX",0f,(i-1)*100f);

            //移动Y
            ObjectAnimator animator_y = ObjectAnimator.ofFloat(views.get(i),"translationY",0f,(views.size()-i-1)*100f);

            animatorSet.play(animator_x).with(animator_y);

            animatorSet.setStartDelay(5000);//设置延迟时间

            animatorSet.start();

            flag = false;
        }

    }

    //合并动画
    private void stopAnim() {

        //位移 -- xy 一起移动 -- 集合
        for(int i = 1;i<views.size();i++)
        {
            AnimatorSet animatorSet = new AnimatorSet();

            //移动X
            ObjectAnimator animator_x = ObjectAnimator.ofFloat(views.get(i),"translationX",(i-1)*100f,0f);

            //移动Y
            ObjectAnimator animator_y = ObjectAnimator.ofFloat(views.get(i),"translationY",(views.size()-i-1)*100f,0f);

            animatorSet.play(animator_x).with(animator_y);

            animatorSet.setStartDelay(5000);//设置延迟时间

            animatorSet.start();

            flag = true;
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值