现在的位置: 首页 > 综合 > 正文

android Bitmap围绕一个点进行旋转

2013年08月13日 ⁄ 综合 ⁄ 共 2769字 ⁄ 字号 评论关闭

在项目中需要使用定位功能,也就是一个点围绕一个圆心进行旋转,查看了canvas的函数也就只有一个 canvas.drawBitmap(bitmap, matrix, paint)通过使用Matrix来实现旋转,这里实现一个demo,功能就是小原点顺时针绘制一个原然后逆时针撤销这个圆,通过Timer来实现。代码如下:

Surface.java这个是实现绘制图形的类

package com.example.test;

import java.util.Timer;
import java.util.TimerTask;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;

@SuppressLint("HandlerLeak")
class Surface extends SurfaceView implements Callback{

	Bitmap bmp;
	private Paint mPaint;
	private SurfaceHolder mHolder;
	public Surface(Context context) {
		super(context);
		mHolder = getHolder();
		mHolder.addCallback(this);
        mPaint = new Paint();
        mPaint.setColor(Color.GREEN);
        mPaint.setAntiAlias(true);//抗锯齿
        setFocusable(true);
        setFocusableInTouchMode(true);
//        setZOrderOnTop(true);
//        mHolder.setFormat(PixelFormat.TRANSPARENT);//设置背景透明
		bmp = BitmapFactory.decodeResource(getResources(), R.drawable.camera_r_local);
 		bmp = Bitmap.createScaledBitmap(bmp, 15, 15, false);
	}

	public Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 0:
				canvas_ok();
				break;
			}
			super.handleMessage(msg);
		}
		
	};
	
	public void canvas_ok(){
		 Canvas canvas = null;
		try {
			canvas = mHolder.lockCanvas();
			canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);//清除屏幕
//	        canvas.save();
	        Matrix matrix = new Matrix();
	        matrix.postTranslate(130, 0);
	        matrix.postRotate(degree, 130 ,130);
	        canvas.drawBitmap(bmp, matrix, mPaint);
//	        canvas.restore();
		} catch (Exception e) {
		}finally {
            if(canvas != null) {
                mHolder.unlockCanvasAndPost(canvas);
            }
        }
	}

	int degree = 0;
	Timer timer = new Timer();
	boolean flag = true;
	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		canvas_ok();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				if (flag) {
					degree++;
					if (degree == 360) {
						flag = false;
					}
				}else {
					degree--;
					if(degree == -360 || degree == 0){
						flag = true;
					}
				}
				Log.e("flag", degree+"  : "+flag);
				handler.sendEmptyMessage(0);
			}
		}, 50, 50);
	}


	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
		
	}


	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		if (timer != null) {
			timer.cancel();
			timer = null;
		}
	}
}

Main7.java是主类

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;

public class Main7 extends Activity{
	Surface surface;
	RelativeLayout.LayoutParams laParams;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		surface = new Surface(this);
		laParams = new RelativeLayout.LayoutParams(260,  260);
		setContentView(surface, laParams);
	}

}

效果图如下:

抱歉!评论已关闭.