今天研究了下Android的canvas.rotate()与canvas.translate,主要是rotate之前不太理解,所以后面计算坐标就不准。搞明白了就好弄了。
总结一下:
rotate:可以看成是旋转X 和Y坐标,把坐标按原点旋转degree之后,再去draw的时候,就是按旋转之后的坐标来,画布什么的不用去思考旋转。注意:degree为正,按顺时针旋转
translate:之前老是认为是移动画布,实际上是移动画笔,就是说移动 x=10,那么就是从坐标x轴10px开始画
可以通过Demo体验一下
主要代码如下:
package com.example.androidtest;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
((ImageView) findViewById(R.id.imageView90))
.setImageBitmap(createBitmap(90));
((ImageView) findViewById(R.id.imageView90))
.setImageBitmap(createBitmap(90));
((ImageView) findViewById(R.id.imageView180))
.setImageBitmap(createBitmap(180));
((ImageView) findViewById(R.id.imageView270))
.setImageBitmap(createBitmap(270));
}
private Bitmap createBitmap(int degress) {
Bitmap icon = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
int iconWidth = icon.getWidth();
Bitmap result = Bitmap.createBitmap(iconWidth * 2, iconWidth * 2,
Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawColor(Color.BLACK);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawRect(new Rect(0, 0, iconWidth, iconWidth), paint);
canvas.drawBitmap(icon, 0, 0, null);
switch (degress) {
case 90: {
canvas.rotate(90);
// canvas.translate(0, -iconWidth*2);
// canvas.drawBitmap(icon, 0, 0, null);
canvas.drawBitmap(icon, 0, -iconWidth * 2, null);
break;
}
case 180: {
canvas.rotate(180);
canvas.translate(-iconWidth * 2, -iconWidth);
canvas.drawBitmap(icon, 0, 0, null);
break;
}
case 270: {
canvas.rotate(270);
canvas.translate(-iconWidth * 2, 0);
canvas.drawBitmap(icon, 0, 0, null);
break;
}
}
return result;
}
}