此案例通过自定义view设置一张风车的图片实现不停旋转的功能。可以先看下面的效果在看具体的实现
和前面一样首先自定义一个类继承View 实现两个构造方法,之后在两个构造方法中都初始化画笔在此案例中用到的canvas的方法先给大家解释一下:
canvas.save()保存状态,
canvas.rotate()旋转
canvas.restore();删除画布属性
invalidate();刷新画布
这四个方法在此案例中起到的比较重要的作用 首先们初始化画笔,然后在ondraw方法中保存状态然后对canvas进行操作,先将图片画到画布上然后通过画布的旋转进行旋转,通过定义degress来改变旋转的角度,通过restore方法保存状态和invalidate不断的进行刷新来实现风车旋转的效果
下面就是实现代码:
package demo.liuchen.com.android27_customview.rotate; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Build; import android.support.annotation.RequiresApi; import android.util.AttributeSet; import android.view.View; import demo.liuchen.com.android27_customview.R; /** * Created by ${LC} on 2016/11/22. */ public class MyRotateView extends View{ private Paint paint; private int degree= 0; public MyRotateView(Context context) { super(context); initPaint(); } public MyRotateView(Context context, AttributeSet attrs) { super(context, attrs); initPaint(); } public void initPaint(){ paint = new Paint(); paint.setAntiAlias(true); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawColor(Color.WHITE); //画布先进行保存然后restore需要配套使用 save可以保存各状态 restore:删除画布属性 canvas.save(); degree++; int width = getWidth(); int height = getHeight(); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.fengches); /** * 对画布进行旋转 * @param degress:旋转的角度,类型为float * @param coorx: x的偏移量 * @param coory: y的偏移量 * */ // canvas.rotate(degree,150,150);//这个点为旋转中心 canvas.rotate(degree,width/3,height/3); /** * 画布画一个正方形 */ canvas.drawBitmap(bitmap, width/3-bitmap.getWidth()/2 , height/3-bitmap.getHeight()/2 ,paint); // canvas.drawRect(100,100,200,200,paint); canvas.restore(); //刷新 invalidate(); } }