如下程序开发了一个自定义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);

    }

}

使用Matrix控制图片和组件的变化的更多相关文章

  1. 使用Matrix控制图像或组件变换的步骤

    1.获取Matrix对象,该Matrix对象既可新创建,也可直接获取其他对象内封装的Matrix(例如Transformation对象内部) 2.调用Matrix的方法进行平移.旋转.缩放.倾斜等. ...

  2. vue - 父组件数据变化控制子组件类名切换

    先说当时的思路和实现核心是父子组件传值和v-bind指令动态绑定class实现 1. 父组件引用.注册.调用子组件script中引用 import child from '../components/ ...

  3. ReactNative学习-滑动查看图片第三方组件react-native-swiper

    滑动查看图片第三方组件:react-native-swiper,现在的版本为:1.4.3,该版本还不支持Android. 下面介绍的是该组件的一些用法,可能总结的不完整,希望大家一起来共同完善. 官方 ...

  4. WPF编程,通过DoubleAnimation控制图片的透明度,将重叠的图片依次显示。

    原文:WPF编程,通过DoubleAnimation控制图片的透明度,将重叠的图片依次显示. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307 ...

  5. 我的Android进阶之旅------>Android通过使用Matrix旋转图片来模拟碟片加载过程

    今天实现了一个模拟碟片加载过程的小demo,在此展示一下.由于在公司,不好截取动态图片,因此就在这截取两张静态图片看看效果先. 下面简单的将代码列出来. setp1.准备两张用于旋转的图片,如下:lo ...

  6. jquery版相片墙(鼠标控制图片聚合和散开)

    照片墙,简单点说就是鼠标点击小图片时,聚合变成一张大图片:点击大图片时,散开变成小图片.这个是我一年前无意间看到的动画效果(现在已经忘记是哪位大神制作的了,引用了他的图片),刚看到这个很炫的动画超级激 ...

  7. CKEditor 自主控制图片上传

    在ASP.NET中使用CKEditor编辑器,如果想控制图片上传,即把上传的图片路径名存到数据中,可以自定义一个上传功能 首先自定义CKEditor的配置文件 在config.js中添加以下代码,红色 ...

  8. js控制图片自动缩放,实现铺满盒子,不变形,完全局中

    此js一般用于控制图片铺满盒子,但是比例不变,并且绝对局中原理:判断图片的高宽与盒子高宽的大小的关系,然后通过比例来控制图片的缩放及定位<!DOCTYPE html PUBLIC "- ...

  9. 基于jQuery可悬停控制图片轮播代码

    基于jQuery可悬停控制图片轮播代码.这是一款可悬停切换全屏轮播jQuery幻灯片.效果图如下: 在线预览   源码下载 实现的代码: <!-- 轮播广告 --> <div id= ...

随机推荐

  1. [转载] 彻底学习STL中的Allocator

    原文: http://cissco.iteye.com/blog/379093 帮助我们理解allocator的原理 Allocator是C++语言标准库中最神秘的部分之一.它们很少被显式使用,标准也 ...

  2. 【Todo】Nginx架构学习

    要进行Web服务,绕不开的就是Nginx.这已经是大型网站的标配.对Nginx进行一定程度的深入学习. http://www.ituring.com.cn/article/4436 http://bl ...

  3. jquery定位

    1.$("div").offset().left ; div到文档的左距离(offset() 方法返回或设置匹配元素相对于文档的偏移) $("div").off ...

  4. openfire消息通知推送

    package cn.zsmy.utils.openfire; import java.io.BufferedReader; import java.io.InputStreamReader; imp ...

  5. poj2975(nim游戏取法)

    求处于必胜状态有多少种走法. if( (g[i]^ans) <= g[i]) num++; //这步判断很巧妙 // // main.cpp // poj2975 // // Created b ...

  6. Mybatis调用Mysql存储过程

    在我的后台系统中,今天需要使用到存储过程.存储过程还真没写过,今天就写了个存储过程.使用在后台中. 其实这个接口功能  是涉及几张表的修改,删除,新增的.就写个一个存储过程. 存储过程: ), ),) ...

  7. JavaScript:引用js文件时的编码格式问题

    JavaScript:引用js文件时的编码格式问题 如果js文件的编码格式是utf-8,并且含有中文,那么按照正常的方法引用,就会出现乱码的情况. 方法/步骤   如果js文件的编码格式是utf-8, ...

  8. mongodb数据库js查询

    #健康风险-disease db.disease.find({versions:'2'}).forEach(function(item){ item.diseaseDetail && ...

  9. 深入理解JVM虚拟机-7虚拟机类加载机制

    虚拟机把描述类的数据从Class文件夹加载到内存,并对数据进行小燕.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 下面所说的Class文件不是具体的某个文件 ...

  10. java 内部类3(匿名内部类)

    匿名内部类: 1.没有类名的类就叫匿名内部类 2.好处:简化书写. 3.使用前提:必须有继承或实现关系......不要想着你自己没有钱你没可是你爸有 4.一般用于于实参.(重点) class Oute ...