使用Matrix控制图片和组件的变化

本文介绍了一种自定义Android View的方法,通过检测方向键触发的键盘事件来实现实时的图形旋转和倾斜变换效果。文章提供了一个具体的实现示例,展示了如何使用Matrix类对图像进行操作,并响应不同的按键来改变图像的状态。

如下程序开发了一个自定义View,该自定义View可以检测到用户的键盘事件,当用户单击手机的方向键时,该自定义View会用Matrix对绘制的图形进行旋转、倾斜变换。

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;

public class MatrixTest extends View{

  //初始化图片资源  

  private Bitmap bitmap;  

  //Matrix实例  

  private Matrix matrix = new Matrix();

  //设置倾斜度  

  private float sx = 0.0f;  

  //位图宽和高  

  private int width;  

  private int height;  

  //缩放比例  

  private float scale = 1.0f;  

  //判断缩放还是旋转  

  private boolean isScale = false;    

  public MatrixTest(Context context, AttributeSet attrs) {   

    super(context, attrs);   

    // 获取位图   

    bitmap = ((BitmapDrawable)context.getResources().getDrawable(R.drawable.ic_launcher,null)).getBitmap();   

    //获得位图宽   

    width = bitmap.getWidth();   

    //获取位图高   

    height = bitmap.getHeight();   

    //使当前试图获得焦点   

    this.setFocusable(true);  

  }  

  @Override  

  protected void onDraw(Canvas canvas) {   

    super.onDraw(canvas);   

    //重置

    Matrix   matrix.reset();   

    if(!isScale){    

      //旋转

      Matrix    matrix.setSkew(sx, 0);   

    }else{    

      //缩放

      Matrix    matrix.setScale(scale, scale);   

    }   

    //根据原始位图和Matrix创建新图片   

    Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);  

    //绘制新位图   

    canvas.drawBitmap(bitmap2, matrix, null);  

  }  

  @Override  

  public boolean onKeyDown(int keyCode, KeyEvent event) {   

    switch (keyCode) {   

      //向左倾斜   

      case KeyEvent.KEYCODE_DPAD_LEFT:    

        isScale = false;    

        sx += 0.1;      

        postInvalidate();   

        break;  

       //向右倾斜  

      case KeyEvent.KEYCODE_DPAD_RIGHT:    

        isScale = false;    

        sx -= 0.1;    

        postInvalidate();    

        break;   

      //放大   

      case KeyEvent.KEYCODE_DPAD_UP:    

        isScale = true;    

        if(scale<2.0){     

          scale += 0.1;    

        }    

        postInvalidate();    

        break;  

      //缩小 

      case KeyEvent.KEYCODE_DPAD_DOWN:    

        isScale = true;    

        if(scale > 0.5){     

          scale -= 0.1;    

        }    

        postInvalidate();    

        break;   

      }   

      return super.onKeyDown(keyCode, event);  

    }

}

转载于:https://www.cnblogs.com/jiww/p/5575262.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值