public class testView extends View { private Bitmap mBitmap = null; private Bitmap nBitmap = null; private float scaleX = 1.0f; private float scaleY = 1.0f; private float step = 0.0001f; public testView(Context context, AttributeSet attrs) { super(context, attrs); mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_pet_spirit); nBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_pet_spirit_lighting); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); scaleCanvas(canvas); invalidate(); } private void scaleCanvas(Canvas canvas) { scaleX += step; scaleY += step; Matrix matrix = new Matrix(); Paint paint = new Paint(); canvas.scale(scaleX, scaleY); canvas.drawBitmap(mBitmap, matrix, paint); canvas.drawBitmap(nBitmap, matrix, paint); } }
先上代码,代码入门级!主要分享(1)canvas动画原理(2)应用场景(3)硬件加速兼容的bug
canvas动画原理:
画布初始大小一定,要通过scale,rotate,translate变化画布大小,角度,位移。在变化后的canvas上绘制想要的内容,内容也就跟着相应的变化。刚开始还以为是要先在canvas上绘制一边,在对canvas变形,这种误区刚开始会困惑很多人。其实canvas的draw方法是将绘制的内容画在变形后的画布上。原理是这样的:每次调用ondraw后都将获得一个新的canvas,这个canvas是一个满屏的区域,如果在刚获得这个canvas后就进行绘制,绘制的内容是立刻就显示出来了,但之后再进行变形后,canvas并不会自行进行绘制,如果在变形后在进行一次绘制,这时图像就重复了。
应用场景:
为什么要用canvas进行变形呢,如果我们用一串图片实现相应的动画,这时就会有大量的内存为题需要考虑。而canvas的变形方式使用的都是native方法,所以自然快,方便。而调用ondraw进行动画效果绘制现在应用在各种view插件上面的是比较多的。各种点击动画效果。
硬件加速兼容的bug:
clipPath()
clipRegion()
drawPicture()
drawTextOnPath()
drawVertices()
这几个方法在调用前一定要确定你已经在调用的activity中关闭了硬件加速,修改manifest
android:hardwareAccelerated="false"。否则你将会发现截取屏幕中的rgb时是有颜色的,可是屏幕一片惨白(幽灵绘制)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。