如何翻转一张图片

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);
		}

	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值