读书频道 > 网站 > 网页设计 > Android应用程序开发与典型案例
10.4.1 使用Matrix实现旋转、缩放和平移
12-10-30    奋斗的小年轻
收藏    我要投稿   
本书共23章,内容包含两大部分。第一部分是Android程序设计基础,在介绍Android环境搭建以及Android系统基本控件和组件后,详细介绍了Android系统应用编程中典型的技术,比如,Android中的图形图像、多媒体编程、...立即去当当网订购

10.4  图形特效

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

在Android图形API中提供了一个Matrix矩形类,该类具有一个3×3的矩阵坐标。通过该类可以实现图形的旋转、平移和缩放。该类的详细方法如表10-6所示。

表10-6  Matrix常用方法


方法名称 方法描述
void reset() 重置一个matrix对象
void set(Matrix src) 复制一个源矩阵,与构造方法Matrix(Matrix src)一样
boolean isIdentity() 返回这个矩阵是否定义
void setRotate(float degrees) 指定一个角度以(0,0)为坐标进行旋转
void setRotate(float degrees, float px, float py) 指定一个角度以(px,py)为坐标进行旋转
void serScale(float sx, float sy) 缩放处理
void serScale(float sx, float sy, float px, float py) 以坐标(px,py)进行缩放
void setTranslate(float dx, float dy) 平移
void setSkew(float kx, float ky) 倾斜处理
void setSkew(float kx, float ky, float px, float py) 以坐标(px,py)进行倾斜
 

下面通过一个实例来演示Matrix的具体应用,在本实例中我们自定义一个View类,在该类中拥有一个Bitmap和Matrix实例,Bitmap实例从系统资源加载一张图片,覆盖View类的onDraw()方法,在该方法中通过reset()方法初始化Matrix,并设置其旋转或缩放属性,使用Canvas的drawBitmap()方法将Bitmap重新绘制在视图中。通过键盘事件onKeyDown()实现旋转属性和缩放属性的改变,调用postInvalidate()方法重新绘制Bitmap。实例步骤说明如下:

(1)创建一个Android工程“GraphicMatrix”,入口Activity的名称为MainActivity。

代码清单10-24  MainActivity.java

package cn.com.farsight.graphicMatrix;

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

(2)在该工程的res/drawable/目录下添加一张图片资源girl.jpg。

(3)在MainActivity中定义一个内部类MyView继承View。在该类的顶部声明使用到的变量,在构造方法中初始化变量,覆盖onDraw()方法和onKeyDown()方法。

代码清单10-25  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  oolean isScale = false;
     
     //构造方法
  public MyView(Context context) {
   super(context);
   // TODO Auto-generated constructor stub
   //获得位图
   bm = BitmapFactory.decodeResource(this.getResources(),
          R.drawable.girl);
   //获得位图宽
   w = bm.getWidth();
   //获得位图高
   h = bm.getHeight();
   //使当前视图获得焦点
   this.setFocusable(true);
  }

  @Override
  protected void onDraw(Canvas canvas) {
   // TODO Auto-generated method stub
   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  oolean onKeyDown(int keyCode, KeyEvent event) {
   // TODO Auto-generated method stub
   //向左旋转
   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);
  }     
}

(4)在MainActivity的onCreate()方法中,实例化MyView并将其设置为当前Activity的视图内容。

代码清单10-26  onCreate()

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyView myView = new MyView(MainActivity.this);
        //设置当前视图布局
        setContentView(myView);
    }

程序运行结果如图10-10、图10-11所示。


 

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:1.3 功能
下一篇:1.5 小结
相关文章
图文推荐
JavaScript网页动画设
1.9 响应式
1.8 登陆页式
1.7 主题式
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站