MainActivity 属性动画常用操作

// 可操控的属性有:alpha;x/y;scaleX/scaleY;rotation/rotationX/rotationY;transitionX/transitionY;pivotX/pivotY

public class MainActivity extends ListActivity {
    private ImageView iv_src;
    private boolean b = true;
    private String[] array = { "重启当前Activity\n启动一个新的Activity",//
            "最简单的ObjectAnimator,控制scaleX\n最简单的ObjectAnimator,控制rotationX", //
            "不存在get/set方法时不会有任何效果\n为Object的某个属性手动提供get/set方法", //
            "只有set没有get方法时,get的值不存在,但是set可以正常使用", //
            "监听动画更新:AnimatorUpdateListener\n监听动画状态:AnimatorListener", //
            "组合动画:AnimatorSet.playTogether\n组合动画:AnimatorSet.with/before/after",//
            "组合动画:AnimatorUpdateListener\n组合动画:PropertyValuesHolder",//
            "组合动画:PVHolder + KeyFrame\nView的animate动画,最简洁的属性动画",//
            "View的animate动画也可以组合动画\n可以在animate动画前/后执行一些操作",//
            "最简单的ValueAnimator,控制translationY\n要明白ValueAnimator只是帮你计算插值的" };
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);//取消标题栏
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
        iv_src = new ImageView(this);
        iv_src.setBackgroundColor(0x330000ff);
        iv_src.setImageResource(R.drawable.icon);
        getListView().addHeaderView(iv_src);
    }
    @Override
    protected void onListItemClick(ListView l, View view, int position, long id) {
        switch (position) {
        case 0:
            b = !b;
            Toast.makeText(this, "目前为:" + b, Toast.LENGTH_SHORT).show();
            break;
        case 1://重启当前Activity        启动一个新的Activity
            if (b) {
                startActivity(new Intent(this, MainActivity.class));
                finish();
            } else startActivity(new Intent(this, SecondActivity.class));
            break;
        case 2://最简单的ObjectAnimator,控制scaleX            最简单的ObjectAnimator,控制rotationX
            if (b) ObjectAnimator.ofFloat(iv_src, "scaleX", 0.1f, 3f, 0.1f, 2f).setDuration(1000).start();//X轴缩放2倍
            else ObjectAnimator.ofFloat(iv_src, "rotationX", 0.0f, 360.0f).setDuration(500).start();//沿X轴旋转360度
            break;
        case 3://不存在get/set方法时不会有任何效果            为Object的某个属性手动提供get/set方法
            int i = new Random().nextInt(8) + 1;
            if (b) ObjectAnimator.ofFloat(iv_src, "width", 100 * i).setDuration(500).start();//没任何效果,但并不会报错
            else ObjectAnimator.ofInt(new WrapperView(iv_src), "width", 100 * i).setDuration(1000).start();
            break;
        case 4://只有set没有get方法时,get的值不存在,但是set可以正常使用
                //View有setBackgroundColor方法,但是没有getBackgroundColor方法,所以getBackgroundColor结果为0
            if (b) ObjectAnimator.ofArgb(iv_src, "backgroundColor", Color.RED).setDuration(3000).start();//startValue不存在
            else ObjectAnimator.ofArgb(iv_src, "backgroundColor", Color.RED, Color.GREEN).setDuration(3000).start();
            break;
        case 5://监听动画更新:AnimatorUpdateListener            监听动画状态:AnimatorListener
            addAnimListener();
            break;
        case 6://组合动画:AnimatorSet.playTogether            组合动画:AnimatorSet.with/before/after
            if (b) combinedAnimPlayTogether();
            else combinedAnimAfterBefore();
            break;
        case 7://组合动画:AnimatorUpdateListener            组合动画:PropertyValuesHolder
            if (b) combinedAnimUpdate();
            else propertyValuesHolder();
            break;
        case 8://组合动画:PVHolder + KeyFrame            View的animate动画,最简洁的属性动画
            if (b) pVHolderKeyFrame();
            else iv_src.animate().setDuration(500).y(100 * (new Random().nextInt(12)));//链式调用返回值类型为ViewPropertyAnimator
            break;
        case 9://View的animate动画也可以组合动画            可以在animate动画前/后执行一些操作
            int j = new Random().nextInt(8) + 1;
            if (b) iv_src.animate().setDuration(1000).rotation(360 * j).scaleX(j * 0.5f).setInterpolator(new DecelerateInterpolator());
            else iv_src.animate().alpha(0).y(1200).setDuration(500).withStartAction(new Runnable() {
                @Override
                public void run() {
                    iv_src.setX(200);
                }
            }).withEndAction(new Runnable() {
                @Override
                public void run() {
                    iv_src.setX(0);
                    iv_src.setY(0);
                    iv_src.setAlpha(1f);
                }
            }).start();
            break;
        case 10://最简单的ValueAnimator,控制translationY            要明白ValueAnimator只是帮你计算插值的
            if (b) valueAnimator();
            else valueAnimator(position);
            break;
        }
    }
    //监听动画绘制过程
    public void addAnimListener() {
        ObjectAnimator anim = ObjectAnimator.ofFloat(iv_src, "alpha", 0.1f).setDuration(1000);
        anim.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Float value = (Float) animation.getAnimatedValue();
                iv_src.setRotationX((1 - value) * 360);
                Log.i("bqt", "onAnimationUpdate--" + value);
            }
        });
        //方法一,实现AnimatorListener接口,定义自己的开始、结束、被取消、重复事件
        if (b) anim.addListener(new AnimatorListener() {
            @Override
            public void onAnimationStart(Animator animation) {
                Log.i("bqt", "【onAnimationStart】");
            }
            @Override
            public void onAnimationRepeat(Animator animation) {
                Log.i("bqt", "【onAnimationRepeat】");
            }
            @Override
            public void onAnimationEnd(Animator animation) {
                Log.i("bqt", "【onAnimationEnd】");
            }
            @Override
            public void onAnimationCancel(Animator animation) {
                Log.i("bqt", "【onAnimationCancel】");
            }
        });
        //方法二,继承AnimatorListenerAdapter,只实现自己想实现的事件
        else anim.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                Log.i("bqt", "【继承AnimatorListenerAdapter--onAnimationEnd】");
            }
        });
        anim.start();
    }
    public void combinedAnimPlayTogether() {
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(iv_src, "scaleX", 0.5f, 0.1f, 2f);
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(iv_src, "alpha", 0.5f, 1f, 0.5f);
        ObjectAnimator anim3 = ObjectAnimator.ofFloat(iv_src, "rotationX", 500);
        AnimatorSet animSet = new AnimatorSet().setDuration(2000);
        animSet.playTogether(anim1, anim2, anim3);
        animSet.start();
    }
    public void combinedAnimAfterBefore() {
        ObjectAnimator anim1 = ObjectAnimator.ofFloat(iv_src, "scaleX", 1.0f, 2f);
        ObjectAnimator anim2 = ObjectAnimator.ofFloat(iv_src, "scaleY", 0.1f, 1f);
        ObjectAnimator anim3 = ObjectAnimator.ofFloat(iv_src, "x", 0, -iv_src.getWidth(), 0);
        ObjectAnimator anim4 = ObjectAnimator.ofFloat(iv_src, "y", 0, iv_src.getY() + 500f, 0);
        ObjectAnimator anim5 = ObjectAnimator.ofFloat(iv_src, "rotationX", 360 * 2);
        AnimatorSet animSet = new AnimatorSet();
        animSet.play(anim1).with(anim2);//anim1,anim2同时执行
        animSet.play(anim2).with(anim3);//anim1,anim2,anim3同时执行
        animSet.play(anim4).after(anim3).before(anim5);//anim4在anim1,anim2,anim3之后,在anim5之前
        animSet.setDuration(1000);
        animSet.start();
    }
    public void combinedAnimUpdate() {
        ObjectAnimator anim = ObjectAnimator.ofFloat(iv_src, "包青天", 0.5f, 0.1f, 2f).setDuration(2000);
        anim.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float cVal = (Float) animation.getAnimatedValue();
                iv_src.setScaleX(cVal);
                iv_src.setAlpha(cVal);
                iv_src.setRotationX(cVal * 360);
            }
        });
        anim.start();
    }
    public void propertyValuesHolder() {
        PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 0.2f, 1f);
        PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 0.8f, 0, 2f);
        PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("rotationY", 360 * 2f, 0);
        ObjectAnimator.ofPropertyValuesHolder(iv_src, pvhX, pvhY, pvhZ).setDuration(1000).start();//三个动画是同时执行的
    }
    public void pVHolderKeyFrame() {
        Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
        Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
        kf1.setInterpolator(new AccelerateInterpolator());
        Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
        PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
        ObjectAnimator.ofPropertyValuesHolder(iv_src, pvhRotation).setDuration(1000).start();
    }
    public void valueAnimator() {
        ValueAnimator animator = ValueAnimator.ofFloat(0, 1200, 0).setDuration(500);//这里并没有设置要操作的【对象】及【对象的属性】
        animator.addUpdateListener(new AnimatorUpdateListener() {//对ValueAnimator来说,这是必要的,否则没有任何意义
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {//在这里可以根据属性值定义自己想要的动作
                Float f = (Float) animation.getAnimatedValue();//这里只能强转为of**时指定的类型,甚至不能强转为Integer类型(因为不是基本类型 int)
                iv_src.setTranslationY(f);//设置要操作的对象的属性。或者你可以使用获取到的值做任何事情
            }
        });
        animator.start();
    }
    public void valueAnimator(final int position) {
        ValueAnimator animator = ValueAnimator.ofArgb(Color.RED).setDuration(5000);
        animator.setTarget(iv_src);//设置要操作的对象,对ValueAnimator来说,这个方法是空方法,因为它不会作用在任何View上
        animator.addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Integer color = (Integer) animation.getAnimatedValue();
                iv_src.setRotationY(color);
                for (int j = 1; j < position; j++) {
                    if (j % 2 == 0) getListView().getChildAt(j).setBackgroundColor(color);
                    else getListView().getChildAt(j).setBackgroundColor(color | Color.GREEN);
                }
            }
        });
        animator.start();
    }

}


SecondActivity 属性动画补充

包含以下演示
  • 自定义TypeEvaluator实现抛物线动画效果
  • 使用LayoutTransition为布局容器中子View的显示与消失设置过渡动画
  • 使用LayoutAnimationController为布局容器中的控件播放同样的动画
public class SecondActivity extends ListActivity {
    private final String[][] array = { INTERPOLATORS1, INTERPOLATORS2, INTERPOLATORS3, INTERPOLATORS4, INTERPOLATORS5, INTERPOLATORS6, };
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);//取消标题栏
        String[] names = { "-1-", "-2-", "-3-", "-4-", "-5-", "-6-", //
                "自定义TypeEvaluator实现抛物线动画效果", //
                "使用LayoutTransition为布局容器中子View的显示与消失设置过渡动画", //
                "使用LayoutAnimationController为布局容器中的控件播放同样的动画", };
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(names))));
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position) {
        case 6:
            startActivity(new Intent(this, TypeEvaluatorActivity.class));
            break;
        case 7:
            startActivity(new Intent(this, LayoutTransitionActivity.class));
            break;
        case 8:
            startActivity(new Intent(this, LayoutAnimationControllerActivity.class));
            break;
        default:
            Intent intent = new Intent(this, InterpolatorActivity.class);
            intent.putExtra(InterpolatorActivity.EXTRA_NAME, array[position]);
            startActivity(intent);
            break;
        }
    }
    public static final String[] INTERPOLATORS1 = new String[] { "EaseBackInInterpolator", "EaseBackInOutInterpolator", "EaseBackOutInterpolator",
            "EaseBounceInInterpolator", "EaseBounceInOutInterpolator", "EaseBounceOutInterpolator", "EaseBreathInterpolator", "EaseCircularInInterpolator",
            "EaseCircularInOutInterpolator", "EaseCircularOutInterpolator", };
    public static final String[] INTERPOLATORS2 = new String[] { "EaseCubicInInterpolator", "EaseCubicInOutInterpolator", "EaseCubicOutInterpolator",
            "EaseExponentialInInterpolator", "EaseExponentialInOutInterpolator", "EaseExponentialOutInterpolator", "EaseInBackInterpolator",
            "EaseInBounceInterpolator", "EaseInCircInterpolator", "EaseInCubicInterpolator", };
    public static final String[] INTERPOLATORS3 = new String[] { "EaseInElasticInterpolator", "EaseInExpoInterpolator", "EaseInOutBackInterpolator",
            "EaseInOutBounceInterpolator", "EaseInOutCircInterpolator", "EaseInOutCubicInterpolator", "EaseInOutElasticInterpolator",
            "EaseInOutExpoInterpolator", "EaseInOutQuadInterpolator", "EaseInOutQuartInterpolator", };
    public static final String[] INTERPOLATORS4 = new String[] { "EaseInOutQuintInterpolator", "EaseInOutSineInterpolator", "EaseInQuadInterpolator",
            "EaseInQuartInterpolator", "EaseInQuintInterpolator", "EaseInSineInterpolator", "EaseOutBackInterpolator", "EaseOutBounceInterpolator",
            "EaseOutCircInterpolator", "EaseOutCubicInterpolator", };
    public static final String[] INTERPOLATORS5 = new String[] { "EaseOutElasticInterpolator", "EaseOutExpoInterpolator", "EaseOutQuadInterpolator",
            "EaseOutQuartInterpolator", "EaseOutQuintInterpolator", "EaseOutSineInterpolator", "EaseQuadInInterpolator", "EaseQuadInOutInterpolator",
            "EaseQuadOutInterpolator", "EaseQuartInInterpolator", };
    public static final String[] INTERPOLATORS6 = new String[] { "EaseQuartInOutInterpolator", "EaseQuartOutInterpolator", "EaseQuintInInterpolator",
            "EaseQuintInOutInterpolator", "EaseQuintOutInterpolator", };

}


自定义TypeEvaluator 实现抛物线效果

public class TypeEvaluatorActivity extends Activity {
    private ImageView iv_src;
    private boolean b = true;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);//取消标题栏
        Bitmap bitmap = Bitmap.createBitmap(20, 20, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setAntiAlias(true);
        paint.setDither(true);
        canvas.drawCircle(10, 10, 10, paint);
        iv_src = new ImageView(this);
        iv_src.setImageBitmap(bitmap);
        setContentView(iv_src, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
            b = !b;
            Point point = new Point();
            ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getSize(point);
            ValueAnimator animator = new ValueAnimator().setDuration(1000);
            //通过new创建的ValueAnimator要明确的setObjectValues和setEvaluator,并且一定要先setObjectValues,再setEvaluator
            if (b) animator.setObjectValues(new PointF(0, 0), new PointF(point.x - iv_src.getWidth(), point.y - iv_src.getHeight()));
            else animator.setObjectValues(new PointF(0, point.y - iv_src.getHeight()), new PointF(point.x - iv_src.getWidth(), 0));
            animator.setEvaluator(new PointFEvaluator());//PointFEvaluator为自定义的估值器,其实就是用来封装你需要的数据用的
            animator.addUpdateListener(new AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    PointF point = (PointF) animation.getAnimatedValue();
                    iv_src.setX(point.x);
                    iv_src.setY(point.y);
                }
            });
            animator.start();
        }
        return super.onTouchEvent(event);
    }

}


自定义的PointFEvaluator

public class PointFEvaluator implements TypeEvaluator<PointF> {
    @Override
    public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
        //只要能保证:当fraction=0时返回值为startValue,并且当fraction=1时返回值为endValue,就是一个比较合理的函数
        PointF pointF = new PointF();
        pointF.x = startValue.x + fraction * (endValue.x - startValue.x);// x方向匀速移动
        pointF.y = startValue.y + fraction * fraction * (endValue.y - startValue.y);// y方向抛物线加速移动
        return pointF;
    }

}


LayoutTransition 属性动画_布局动画

public class LayoutTransitionActivity extends Activity implements OnCheckedChangeListener, OnClickListener {
    private GridLayout gl_container;//父布局
    //布局动画,当容器中的视图发生变化时存在过渡的动画效果。默认为全部开启状态,使用的是默认的动画效果,但是这些都是可以更改的
    private LayoutTransition mTransition = new LayoutTransition();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        gl_container = (GridLayout) findViewById(R.id.gl_container);
        findViewById(R.id.btn).setOnClickListener(this);
        ((CheckBox) findViewById(R.id.appear)).setOnCheckedChangeListener(this);
        ((CheckBox) findViewById(R.id.change_appear)).setOnCheckedChangeListener(this);
        ((CheckBox) findViewById(R.id.disappear)).setOnCheckedChangeListener(this);
        ((CheckBox) findViewById(R.id.change_disappear)).setOnCheckedChangeListener(this);
        ((CheckBox) findViewById(R.id.layout_attr)).setOnCheckedChangeListener(this);
        gl_container.setLayoutTransition(mTransition);
    }
    @Override
    public void onCheckedChanged(CompoundButton view, boolean isChecked) {
        if (view.getId() == R.id.layout_attr) {//等价于xml中【animateLayoutChanges】属性为false(默认)还是true
            gl_container.setLayoutTransition(isChecked ? new LayoutTransition() : null);
            return;
        } else {
            mTransition = new LayoutTransition();
            switch (view.getId()) {
            case R.id.appear://当一个View在ViewGroup中【出现】时,对【此View】设置的动画
                mTransition.setAnimator(LayoutTransition.APPEARING, isChecked ? mTransition.getAnimator(LayoutTransition.APPEARING) : null);
                break;
            case R.id.change_appear://当一个View在ViewGroup中【出现】时,对此View对其他View位置造成影响,对【其他View】设置的动画
                mTransition.setAnimator(LayoutTransition.CHANGE_APPEARING, isChecked ? mTransition.getAnimator(LayoutTransition.CHANGE_APPEARING) : null);
                break;
            case R.id.disappear://当一个View在ViewGroup中【消失】时,对【此View】设置的动画
                mTransition.setAnimator(LayoutTransition.DISAPPEARING, isChecked ? mTransition.getAnimator(LayoutTransition.DISAPPEARING) : null);
                break;
            case R.id.change_disappear:////当一个View在ViewGroup中【消失】时,对此View对其他View位置造成影响,对【其他View】设置的动画
                mTransition.setAnimator(LayoutTransition.CHANGE_DISAPPEARING, isChecked ? mTransition.getAnimator(LayoutTransition.CHANGE_DISAPPEARING) : null);
                break;
            }
            gl_container.setLayoutTransition(mTransition);
        }
    }
    @Override
    public void onClick(View view) {
        final Button button = new Button(this);
        button.setText(gl_container.getChildCount() + 1 + "");
        gl_container.addView(button, gl_container.getChildCount());//放置在最后那个位置
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                gl_container.removeView(button);
            }
        });
    }

}


LayoutAnimationController 布局动画

public class LayoutAnimationControllerActivity extends ListActivity {
    String[] array = { "添加HeaderView", "移除HeaderView", "添加移除View时没任何卵用",//
            "delay位间隔时间,单位为秒", "animation为设置动画的文件", "animationOrder为进入方式" };
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(array))));
        Animation animation = AnimationUtils.loadAnimation(this, android.R.anim.slide_in_left);//先加载【补间动画】
        LayoutAnimationController lac = new LayoutAnimationController(animation);//再设置布局动画
        lac.setOrder(LayoutAnimationController.ORDER_NORMAL);//设置控件显示的顺序;normal=0 默认,reverse=1 倒序,random=2 随机
        lac.setDelay(0.6f);//设置控件显示间隔时间,注意单位是秒;可以为70%,也可以是一个浮点数
        getListView().setLayoutAnimation(lac);//在XML中设置时是使用 android:layoutAnimation="@anim/layout_anim"
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position - getListView().getHeaderViewsCount()) {
        case 0:
            ImageView iv = new ImageView(this);
            iv.setImageResource(R.drawable.ic_launcher);
            getListView().addHeaderView(iv);
            break;
        case 1:
            if (getListView().getHeaderViewsCount() > 0) getListView().removeHeaderView(getListView().getChildAt(0));
            break;
        }
    }

}


自定义Interpolator 实现各种加速效果

public class InterpolatorActivity extends ListActivity {
    private ImageView iv_src;
    private ObjectAnimator mAnimator;
    private static final String IN_PG_NAME = "com.bqt.anim.interpolator.";
    public static final String EXTRA_NAME = "interpolators";
    private String[] mInterpolators;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);//取消标题栏
        mInterpolators = getIntent().getStringArrayExtra(EXTRA_NAME);
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>(Arrays.asList(mInterpolators))));
        iv_src = new ImageView(this);
        iv_src.setBackgroundColor(0x330000ff);
        iv_src.setImageResource(R.drawable.icon);
        getListView().addHeaderView(iv_src);
        DisplayMetrics metric = new DisplayMetrics();
        ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);
        mAnimator = ObjectAnimator.ofFloat(iv_src, "y", 0, metric.heightPixels, 0).setDuration(1500);
    }
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        if (position == 0) {
            Intent intent = new Intent(this, InterpolatorActivity.class);
            intent.putExtra(InterpolatorActivity.EXTRA_NAME, mInterpolators);
            startActivity(intent);
            finish();
        } else selectDrawerItem(position-1);
    }
    private void selectDrawerItem(int position) {
        String name = mInterpolators[position];
        TimeInterpolator interpolator = null;
        try {
            Class<?> clazz = Class.forName(IN_PG_NAME + name);
            interpolator = (TimeInterpolator) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        if (interpolator != null) {
            mAnimator.cancel();
            mAnimator.setInterpolator(interpolator);
            mAnimator.start();
        }
    }

}


附件列表

【属性动画示例】Property Animation的更多相关文章

  1. Android(java)学习笔记263:Android下的属性动画(Property Animation)

    1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(fra ...

  2. Android 属性动画(Property Animation) 全然解析 (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...

  3. Android 属性动画(Property Animation) 完全解析 (下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animatio ...

  4. 通过AnimationSet 同步或一部播放多个动画 Android 属性动画(Property Animation) 完全解析 (下)

    AnimationSet提供了一个把多个动画组合成一个组合的机制,并可设置组中动画的时序关系,如同时播放,顺序播放等. 以下例子同时应用5个动画: 播放anim1: 同时播放anim2,anim3,a ...

  5. Android(java)学习笔记207:Android下的属性动画(Property Animation)

    1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(fra ...

  6. Android 属性动画(Property Animation) 完全解析 (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提 供了几种动画类型:View Anima ...

  7. 【转】Android 属性动画(Property Animation) 完全解析 (上)

    http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提供了几种动画类型:View Animation .Dra ...

  8. Android 属性动画(Property Animation) 全然解析 (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提供了几种动画类型:View Animat ...

  9. 属性动画(Property Animation)资源

    Animator 代表一个属性动画,但它只是一个抽象类,通常会使用它的子类:AnimatorSet.ValueAnimator.ObjectAnimator.TimeAnimator. 定义属性动画的 ...

  10. Android动画基础——属性动画(Property Animation)

    本篇涉及例子下载:Github 本篇讲android 3.0引入的属性动画框架,上篇写视图动画View Animation时就说过ViewAnimation的缺点,那就是动画作用的是view本身的视觉 ...

随机推荐

  1. Python全栈开发之3、数据类型set补充、深浅拷贝与函数

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5466082.html 一.基本数据类型补充 set是一个无序而且不重复的集合,有些类似于数学中的集合,也可以求交集, ...

  2. ubuntu各种软件安装-装机整套系列

    首先声明,本人系统ubuntu 14.04.1 LTS, 以下所有软件均安装于该系统. 一. 首先在windows下删除ubuntu,删除方法如下: 1.进入win7,下载个软件MbrFix,放在C: ...

  3. 微信开发(一)SAE环境搭建

    登录新浪sae平台,点击sae 点击创建新应用->继续创建 环境选择: 填好后点击创建应用 点击创建版本 点击链接可以访问,点击编辑代码可以在线编辑,代码上传可以是svn,git,可以在线上传 ...

  4. 转: CreateProcessAsUser 0xC0000005访问冲突问题

    转:http://blog.csdn.net/glc22/article/details/77227367   在使用CreateProcessAsUser时出现了 0xC0000005访问冲突问题, ...

  5. LCA:Tarjan算法实现

    本博文转自http://www.cnblogs.com/JVxie/p/4854719.html,转载请注明出处 首先是最近公共祖先的概念(什么是最近公共祖先?): 在一棵没有环的树上,每个节点肯定有 ...

  6. CentOS7 安装Python3.6.4

    1. 安装依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline- ...

  7. django celery(QQ蓝鲸)

    官方:http://www.celeryproject.org 文档:http://docs.jinkan.org/docs/celery/index.html FAQ:http://docs.cel ...

  8. Ubuntu16.04安装mongodb 及使用

    1.导入软件源的公钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927 2.为mongodb创建软件 ...

  9. 克鲁斯卡尔(并查集)hdu 1233

    还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  10. 主席树+dfs SPOJ BZOJ2588 Count on a tree

    这道题我由于智障错误导致一直错. 在树上建主席树,加上lca思想,很简单. #include<bits/stdc++.h> using namespace std; ; struct no ...