• 使用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);  

        }

    }

  • 相关阅读:
    Android MulticastSocket IP组播
    IP组播技术介绍及实现例子
    机器学习:多变量线性回归
    慘挂阿里笔试题
    Android使用am命令实现拨打电话、打开应用
    社交O2O的进化
    hibernate4中HHH000273的错误
    Java中常见的排序算法
    Axure实现淡入淡出效果
    Ubuntu虚拟机+ROS+Android开发环境配置笔记
  • 原文地址:https://www.cnblogs.com/jiww/p/5575262.html
Copyright © 2020-2023  润新知