如下程序开发了一个自定义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. [转] Git SSH Key 生成步骤

    Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置. github的SSH配置如下: 一 . 设置Git的user name和email: $ git ...

  2. c++ IO的继承结构

    #include <stdio.h> #include <iostream>//cin,cout #include <sstream>//ss transfer. ...

  3. Dolphin for Android(v11.5.1[Jetpack:内置])

    1. 下载的地址为“http://www.techspot.com/downloads/5927-dolphin-browser-for-android.html” ZC: 由于 Google Pla ...

  4. android电池管理系统从上层的java到底层驱动的调用(转载)

    1.概述 随着移动智能设备的快速发屏,电池的续航能力在很大情况下诱导了大众消费者的购买选择,android系统对电源管理的合理与否直接影响到电池的续航能力,而电池系统作为其中的一部分,主要用于对电池状 ...

  5. Python学习(3)变量类型

    目录 变量赋值 多个变量赋值 标准数据类型 Python数字 Python字符串 Python列表 Python元组 Python元字典 Python数据类型转换 type数据类型查看 变量赋值 Py ...

  6. 使用xml方式定义补间动画

    在res下创建一个目录 anim目录 public class MainActivity extends Activity { private ImageView iv; @Override prot ...

  7. 基础2 JVM

    1. 内存模型以及分区,需要详细到每个区放什么. //运行时数据区域 方法区 Method Area 各个线程共享的内存区域 存储已被虚拟机加载的类信息 常量 静态变量 即时编译器编译后的代码 虚拟机 ...

  8. 【CDN】海外免费加速CDN:Incapsula,CloudFare

    最近服务器要搬迁到香港,因为后续有国外用户使用,基于此要使用大陆和海外都比较好的cdn才好 一开始国外同事推荐CloudFare,后来看看效果开始使用Incapsula CloudFare 官网:ht ...

  9. Linq To Sql 语法 子查询 & In & Join

    子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 =from cin ctx.Customers                    where                  ...

  10. Sublime Text 3使用技巧

    工欲善其事必先利其器,用了很多编辑器,pycharm.Eclipse.notepad++.ultra edit等等,要么是太卡,要么是太简陋 论性感,论轻便,论功能,我选Sublime Text 参考 ...