您的位置:首页 > 移动开发 > Android开发

【Android开发小记--7】动画--简单的button移动和图片3D翻转

2016-02-04 23:40 651 查看

button移动:

分别用视图和属性方法的XML配置与代码编写来实现

效果图:



MainActivity.java :

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化监听
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this);
        findViewById(R.id.button4).setOnClickListener(this);
        findViewById(R.id.imageView).setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            //-----ViewAnimation---XML---------
            case R.id.button1:
                v.startAnimation(AnimationUtils.loadAnimation(MainActivity.this,R.anim.anim_button));
                break;
            //-----ViewAnimation---Java Code-------
            case R.id.button2:
                viewAnimation(v);
                break;
            //-----FrameAnimator---XML---------
            case R.id.button3:
                frameAnimatorXML(v);
                break;
            //-----FrameAnimator---Java Code---------
            case R.id.button4:
                frameAnimatorCode(v);
                break;
            //-----图片翻转-----------------------------
            case R.id.imageView:
                imageAnimate(v);
                break;
            default:
                break;
        }
    }
    /* ViewAnimation---Java Code */
    private void viewAnimation(View v) {
        AnimationSet as = new AnimationSet(true);
        TranslateAnimation ta1 = new TranslateAnimation(0,200,0,0);
        ta1.setDuration(1000);
        as.addAnimation(ta1);
        TranslateAnimation ta2 = new TranslateAnimation(0,0,0,200);
        ta2.setDuration(1000);
        ta2.setStartOffset(1000);
        as.addAnimation(ta2);
        v.startAnimation(as);
    }
    /*FrameAnimator---XML*/
    private void frameAnimatorXML(View v) {
        AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(this,R.animator.animator_button);
        animator.setTarget(v);
        animator.start();
    }
    /*FrameAnimator---Java Code*/
    private void frameAnimatorCode(View v) {
        AnimatorSet set = new AnimatorSet();
        set.setDuration(1000);
        set.playSequentially(ObjectAnimator.ofFloat(v, "translationX", 0, 200),
                ObjectAnimator.ofFloat(v, "translationY", 0, 200),
                ObjectAnimator.ofFloat(v, "translationY", 200, 0),
                ObjectAnimator.ofFloat(v, "translationX", 200, 0));
        set.start();
    }
    /*图片翻转*/
    private void imageAnimate(View v) {
        AnimationSet as = new AnimationSet(true);
        //首次翻转,使用自定义动画 ImageAnim3D
        ImageAnim3D imgAnim3D = new ImageAnim3D(false);
        imgAnim3D.setDuration(1000);
        v.measure(0, 0);
        imgAnim3D.setCenter(v.getWidth() / 2, v.getHeight() / 2);
        imgAnim3D.setFillAfter(true);
        as.addAnimation(imgAnim3D);
        //翻转回来
        ImageAnim3D imgAnim3D2 = new ImageAnim3D(true);
        imgAnim3D2.setDuration(1000);
        imgAnim3D2.setStartOffset(1000);
        v.measure(0, 0);
        imgAnim3D2.setCenter(v.getWidth() / 2, v.getHeight() / 2);
        as.addAnimation(imgAnim3D2);
        v.startAnimation(as);
    }
}


视图动画,res/anim 下:
anim_button.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="1000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:toXDelta="200"
        android:toYDelta="0" />
    <translate
        android:duration="1000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:startOffset="1000"
        android:toXDelta="0"
        android:toYDelta="200" />
</set>


属性动画,res/animator 下:

animator_button.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="sequentially">
    <objectAnimator
        android:duration="1000"
        android:propertyName="translationX"
        android:valueFrom="0"
        android:valueTo="200" />
    <objectAnimator
        android:duration="1000"
        android:propertyName="translationY"
        android:valueFrom="0"
        android:valueTo="200" />
    <objectAnimator
        android:duration="1000"
        android:propertyName="translationY"
        android:valueFrom="200"
        android:valueTo="0" />
    <objectAnimator
        android:duration="1000"
        android:propertyName="translationX"
        android:valueFrom="200"
        android:valueTo="0" />
</set>


imageView翻转:

自定义Animation() 为 ImageAnim3D( boolean turn ) ,turn为false代表正向翻转,true代表反向翻转。

ImageAnim3D.java

public class ImageAnim3D extends Animation {
    private float mCenterX = 0;
    private float mCenterY = 0;
    private boolean turn; //当为false则是正常翻转,为ture则是翻转回来
    public ImageAnim3D(boolean turn) {
        this.turn = turn;
    }
    public void setCenter(float centerX, float centerY) {
        mCenterX = centerX;
        mCenterY = centerY;
    }
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        Matrix matrix = t.getMatrix();
        Camera camera = new Camera();
        camera.save();
        if (!turn) {
            //正向翻转
            camera.rotateY(180 * interpolatedTime);
        } else {
            //反向翻转
            camera.rotateY(-180 * interpolatedTime);
        }
        camera.getMatrix(matrix);
        camera.restore();
        matrix.preTranslate(-mCenterX, (float) (-0.2 * mCenterY));
        matrix.postTranslate(mCenterX, (float) (0.2 * mCenterY));
    }
}


具体代码点击

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: