Apidemo学习之AnimateDrawables(跑马灯效果)

 
private static class SampleView extends View {
        private AnimateDrawable mDrawable;

        public SampleView(Context context) {
            super(context);
            setFocusable(true);
            setFocusableInTouchMode(true);

            //从资源中得到一个Drawable对象
            Drawable dr = context.getResources().getDrawable(R.drawable.beach);
            
            
            //设置drawable对象的矩形范围,用于绘制的范围,矩形可大可小,但是一定是全幅图片。
            dr.setBounds(0, 0, dr.getIntrinsicWidth()/2, dr.getIntrinsicHeight()/2);
            
            /**
             * 四个参数 fromXDelta, toXDelta, fromYDelta, toYDelta
             * 起始X坐标,结束X坐标,起始Y坐标,结束Y坐标
             */
            Animation an = new TranslateAnimation(0, 100, 0, 200);
            an.setDuration(2000);//每次动画完成时间,在2000毫秒
            an.setRepeatCount(4);//动画的重复次数(第一次不计算在内),如果小于0,则一直循环。
            an.initialize(10, 10, 10, 10);//这个初始化,不理解?代码不能注释,否则动画失效
            
            mDrawable = new AnimateDrawable(dr, an);//构建一个动画的drawAble对象
            an.startNow();//启动动画特效
        }
        
        /**
         * simpleView 显示,绘制
         */
        @Override protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.WHITE);

            mDrawable.draw(canvas);//调用drawAble对象的draw方法
            invalidate();//实时更新,代码注释后,动画失效,只停留在初始化状态中,不停的调用onDraw
        }
    }

 

AnimateDrawable .java中的draw方法

 /**
     * 绘制drawAble 
     */
    @Override
    public void draw(Canvas canvas) {
        Drawable dr = getProxy(); //drawAble资源图片
        if (dr != null) {
            int sc = canvas.save();
          //用来保存Canvas的状态,save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。
            Animation anim = mAnimation;
            if (anim != null) {
                anim.getTransformation(
                                    AnimationUtils.currentAnimationTimeMillis(),
                                    mTransformation);
                //动画里最重要的方法是 getTransformation (currentTime, outTransformation),
                //该方法根据当前间 (currentTime) 和 interpolator,计算当前的变换,在 outTransformation 中返回。
                canvas.concat(mTransformation.getMatrix());//矩阵
            }
            dr.draw(canvas);//根据canvas 绘制drawAble
            canvas.restoreToCount(sc);
            //用来恢复Canvas之前保存的状态。防止save后对Canvas执行的操作对后续的绘制有影响。
            //save和restore要配对使用(restore可以比save少,但不能多),如果restore调用次数比save多,会引发Error
        }
    }


 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值