定制自己的动画 View 控件(Canvas 使用)
2018-01-11 17:52
323 查看
定制自己的动画 View 控件(Canvas 使用)
如果要定义自己的 View 控件,则需要新建一个类继承 android.view.View。然后在 onDraw 中写自己需要实现的方式。这里定制了一个非常简单的动画,让 Android Studio 默认工程的圆形 logo 沿着对角线运动,且运动过程中进行旋转。
以下为具体步骤:
新建工程,从 mipmap 下复制一个 ic_launcher_round.png 到 drawable 目录下
新建一个类,继承自 View,这里命名为 MyView,需要注意,它的构造函数需要选择 2 个形参的
private Resources mResources; private Paint mPaint; private Bitmap mBitmap; private int mBitmapHeight; private int mBitmapWidth; private int mViewHeight; private int mViewWidth; private int x; private int y; private int rotation; public MyView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mResources = getResources(); initPaint(); initBitmap(); x = mViewWidth; y = mViewHeight; rotation = 0; } private void initPaint() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setFilterBitmap(true); } private void initBitmap() { mBitmap = ((BitmapDrawable)mResources .getDrawable(R.drawable.ic_launcher_round,null)) .getBitmap(); mBitmapHeight = mBitmap.getHeight(); mBitmapWidth = mBitmap.getWidth(); }
重写 onDraw 方法
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // canvas.drawBitmap(mBitmap,0,0,mPaint); /** * 不旋转画布的方式 * 位置 A 和 位置 B 不重叠,位置 B 和位置 C 重叠 * 说明位置 A 的图形恢复完成后,已经主动将画布恢复现场,则save()和restore()方法本身并没有什么用 */ // canvas.save(); // Matrix matrix = new Matrix(); // matrix.postTranslate(x,y); // matrix.postRotate(rotation,x + mBitmapWidth / 2,y + mBitmapHeight / 2); // 这里按照网络上的说法,画布已经经过了移动和旋转 // 位置 A // canvas.drawBitmap(mBitmap,matrix,mPaint); // 位置 B // canvas.drawBitmap(mBitmap,0,0,mPaint); // canvas.restore(); // 位置 C // canvas.drawBitmap(mBitmap,0,0,mPaint); /** * 旋转画布的方式 */ canvas.save(); // 画布的原点移动到了(x,y)点 --> (x,y)->(0,0) canvas.translate(x,y); // 画布在(0,0)点进行了旋转,旋转角度是 rotation,旋转的中心点是(mBitmapWidth/2,mBitmapHeight/2) canvas.rotate(rotation,mBitmapWidth / 2,mBitmapHeight / 2); // 在(0,0)点绘制需要的图形 canvas.drawBitmap(mBitmap,0,0,mPaint); // 将画布恢复 canvas.restore(); // 还是用之前的语句再绘制需要的图形 canvas.drawBitmap(mBitmap,0,0,mPaint); // 图形不重叠 x++; y++; rotation+=1; if (x > mViewWidth - mBitmapWidth || y > mViewHeight - mBitmapHeight) { x = 0; y = 0; } postInvalidate(); // 这句话将会调用 onDraw(),也就是说,这个函数陷入死循环 }
相关文章推荐
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
- iOS 自定义view 如何不使用self.view也就是系统自带的 view,使用自己定制的view
- Android中使用SurfaceView和Canvas来绘制动画
- 自己使用js/jquery写的一个定制对话框控件
- 自己定义控件三部曲之动画篇(七)——ObjectAnimator基本使用
- 实现控件移动(一)--使用View动画
- Android中使用SurfaceView和Canvas来绘制动画
- Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现
- iOS 定制controller过渡动画 ViewController Custom Transition使用体会
- 自己使用js/jquery写的一个定制对话框控件
- Android中使用SurfaceView和Canvas来绘制动画
- IOS开发-UI学习-使用UIImageView控件制作动画
- android控件使用---recycleview自定义上拉加载,和加载多个布局及加入动画
- Android中使用canvas定制控件(控件周围阴影)
- IOS UI学习教程之使用UIImageView控件制作动画
- Android中使用canvas定制控件(控件周围阴影)
- 使用 Rational Functional Tester 测试定制的 Java 控件
- 在formview控件模板列中使用两个DropDownList控件进行联动时的操作方法
- Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用。 (FromView)
- 用户控件的定制和使用