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

使用Matrix实现旋转缩放和平移

2013年02月15日 ⁄ 综合 ⁄ 共 1951字 ⁄ 字号 评论关闭

本例中自定义一个View类,在该类中拥有一个BitmapMatrix实例,Bitmap实例从系统资源加载一张图片,覆盖View类的onDraw()方法,在该方法中通过reset()方法初始化Matrix,并设置其旋转或缩放属性,使用CanvasdrawBitmap()方法将Bitmap重新绘制在视图中。通过键盘事件onKeyDown()实现旋转属性和缩放属性的改变,调用postInvalidate()方法重新绘制Bitmap

程序运行效果图如下:

 

程序源码如下:

package cn.lion.MatrixTest;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyView myView = new MyView(MainActivity.this);
        
        //设置当前视图布局
        setContentView(myView);
    }
    class MyView extends View{
    	
    	//位图实例
    	private Bitmap bm;
    	//Matrix实例
    	private Matrix matrix = new Matrix();
    	//旋转角度
    	private float angle = 0.0f;
    	//位图的宽和高
    	private int w, h;
    	//缩放比例
    	private float scale = 1.0f;
    	//判断是缩放还是旋转
    	private boolean isScale = false;
    	//构造方法
    	public MyView(Context context){
    		super(context);
    		//获得位图
    		bm = BitmapFactory.decodeResource(this.getResources(), R.drawable.girl);
    		//获得位图宽
    		w = bm.getWidth();
    		//获得位图高
    		h = bm.getHeight();
    		//使当前位图获得焦点
    		this.setFocusable(true);
    	}
    	@Override
    	protected void onDraw(Canvas canvas){
    		super.onDraw(canvas);
    		//重置Matrix
    		matrix.reset();
    		if(!isScale){
    			//旋转Matrix
    			matrix.setRotate(angle);
    		}else{
    			//缩放Matrix
    			matrix.setScale(scale, scale);
    		}
    		//根据原始位图和Matrix创建新视图
    		Bitmap bm2 = Bitmap.createBitmap(bm, 0, 0, w, h, matrix, true);
    		//绘制新视图
    		canvas.drawBitmap(bm2, matrix, null);
    	}
    	@Override
    	public boolean onKeyDown(int keyCode, KeyEvent event){
    		
    		//向左旋转
    		if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
    			isScale = false;
    			angle++;
    			postInvalidate();
    		}
    		//向右旋转
    		if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
    			isScale = false;
    			angle--;
    			postInvalidate();
    		}
    		//放大
    		if(keyCode == KeyEvent.KEYCODE_DPAD_UP){
    			isScale = true;
    			if(scale < 2.0)
    			{
    				scale += 0.1;
    			}
    			postInvalidate();
    		}
    		//缩小
    		if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){
    			isScale = true;
    			if(scale > 0.5){
    				scale -= 0.1;    				
    			}
    			postInvalidate();
    		}
    		return super.onKeyDown(keyCode, event);
    	}
    }
}

 

【上篇】
【下篇】

抱歉!评论已关闭.