android中对图片操作的集中在变换矩阵Matrix和graphic.Camera上。Matrix提供了二维的变换translate平移,scale缩放,rotate旋转,skew倾斜;Camera提供了翻转等操作。
先看结果:
再看代码:
package org.daniel.android.suit.widget;
import org.daniel.android.suit.R;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Camera;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
/**
* 可以周期性翻转的图片
*
* @author Daniel.J <br>
* email:yangjiao623@gmail.com
* @version 创建时间: Jan 5, 2013 4:13:47 PM
* */
public class RotateView extends View {
private Camera mCamera;
private Bitmap mBitmap;
private Paint mPaint;
private Matrix mMatrix;
private int mDegree;
private RollRunnable mRollRunnable;
// 5秒转一圈
private static final int INTERVAL = 5 * 1000 / 360;
public RotateView(Context context) {
super(context);
init(context);
}
public RotateView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public RotateView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
// android.graphics.Camera,别引用错了
mCamera = new Camera();
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rain);
// Paint可以设置透明度
mPaint = new Paint();
mPaint.setAntiAlias(true);
// 变换矩阵
mMatrix = new Matrix();
// 做动画用的
mRollRunnable = new RollRunnable();
}
@Override
protected void onDraw(Canvas canvas) {
mMatrix.reset();
mCamera.save();
// mDegree是旋转的角度,随时间周期性变化。
// 这里让图片围绕Y轴旋转,还可一围绕X轴和Z轴旋转
mCamera.rotateY(mDegree);
// 获得变换矩阵
mCamera.getMatrix(mMatrix);
mCamera.restore();
// pre处理将要送给Camera变换的图片;post处理Camera变换之后的图片
// 顺序:pre2 -> pre1 -> camera -> post1 -> post2
// 在翻转前将图片移动到中心对应于原点的地方
mMatrix.preTranslate(-mBitmap.getWidth() / 2, -mBitmap.getHeight() / 2);
// 将翻转之后的图片移动到画布的中央
mMatrix.postTranslate(getWidth() / 2, getHeight() / 2);
canvas.drawBitmap(mBitmap, mMatrix, mPaint);
}
/**
* 开始旋转图片
* */
public void start() {
removeCallbacks(mRollRunnable);
post(mRollRunnable);
}
/**
* 停止旋转图片
* */
public void stop() {
removeCallbacks(mRollRunnable);
}
/**
* android自带的动画都是通过向handler发送重绘请求来做的,<br>
* 感觉SurfaceView是给相机预览和openGL用的。普通动画用不上<br>
* 通过handler做动画的好处是开销小
*/
private class RollRunnable implements Runnable {
@Override
public void run() {
// 周期性变换角度
mDegree++;
mDegree = mDegree == 360 ? 0 : mDegree;
// 最终调用ViewRoot,给handler发送刷新请求。所以说,刷新也不是同步的
invalidate();
// 延时重绘,给handler发送下次重绘
postDelayed(this, INTERVAL);
}
}
}