初学Android,图形图像之Matrix(二十九)

news/2024/7/8 5:21:05 标签: matrix, android, 图形, layout, encoding, float
Matrix类可以控制图形的平移,旋转,缩放,倾斜,也可以控制View组件的平移,旋转,倾斜等

下面的例子postInvalidate方法会重绘,随之调用onDraw方法,在onDraw方法里再对位图进行缩放和倾斜操作

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

public class MyView extends View {
    //初始的图片资源
	private Bitmap bitmap;
	//Matrix实例
	private android.graphics.Matrix matrix = new android.graphics.Matrix();
	//设置倾斜度
	private float sx = 0.0f;
	//位图宽和高
	private int width,height;
	//缩放比例
	private float scale = 1.0f;
	//判断缩放还是旋转
	private boolean isScale = false;
	public MyView(Context context, AttributeSet attrs) {
		super(context, attrs);
		//获得位图
		bitmap = ((BitmapDrawable)context.getResources().getDrawable(R.drawable.psb)).getBitmap();
		//获得位图宽
		width = bitmap.getWidth();
		//获得位图高
		height = bitmap.getHeight();
		//使当前视图获得焦点
		this.setFocusable(true);
	}
	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);
	}
	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);
	}
}

在Main.xml引用自定义的View组件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <WangLi.Graphics.Matrix.MyView android:layout_width="fill_parent" android:layout_height="fill_parent"/>
</LinearLayout>
下面是效果




http://www.niftyadmin.cn/n/1411374.html

相关文章

经典类与新式类的区别

经典类&#xff1a; class Foo: 新式类&#xff1a; class Foo(object): 创建类的时候&#xff0c;继承object类&#xff0c;该类就是新式类&#xff01; 这一切在python3之后发生了变化&#xff0c;python3里面创建的都是新式类 这两种类的区别&#xff1a; 新式类重定义的方法…

初学Android,图形图像之游戏画面中飞行的飞机(三十)

上面的飞机移动背景是用定时器不断挖取源位图的块&#xff0c;从而形成背景移动的假象 控制图片背景不断下移&#xff0c;就会感觉飞机在不断的飞行 本程序有两个位图&#xff0c;一个背景图&#xff0c;高度远超过屏幕的高度&#xff0c;然后是一张飞机的位图package WangLi.G…

react-router-dom示例讲解(五)——阻止导航

在react-router-dom的官方示例中&#xff0c;阻止导航也是一个较简单的示例。其核心就是Prompt组件。它有一个message属性&#xff0c;当导航离开当前page的时候&#xff0c;会提示这个message信息。它的另一个重要的属性是when属性&#xff0c;when属性的作用是当它的值为true…

win10 无法登录远程桌面的解决方法

1.下载 RDPWrap-v1.6 地址&#xff1a;http://pan.baidu.com/s/1dDNzpj72.管理员身份运行install.bat。3.管理员身份运行update.bat。4.运行RDPConfig.exe&#xff0c;看到Diagnostics后面都是绿色的&#xff0c;并且Listener state是Listening [fully supported]。5.从另一台机…

初学Android,图形图像之游戏画面中飞行的飞机(三十一)

这篇接着上篇内容&#xff0c;在飞机的基础上加入了飞机跟随手指移动&#xff0c;还有飞行路线左右方向随机移动的敌机&#xff0c;看样子像喝醉酒一样&#xff0c;呵呵......汗死&#xff0c;这个太原始了&#xff0c;初学嘛&#xff0c;呵呵 代码还是接着上篇的基础上改的pac…

Linux命令:MySQL系列之十三--MySQL备份与还原(针对单张表SELECT备份重要章节)

对于只备份单张表的备份与还原&#xff0c;通过SELECT命令&#xff0c;可以更快速的达到备份和恢复的目的&#xff1b;以及通过此方法把一个数据库中表的数据&#xff0c;导入至另一数据库的表中去。备份格式&#xff1a;SELECT * INTO OUTFILE /PATH/TO/somefile.txtFROM tabl…

初学Android,图形图像之使用drawBitmapMesh扭曲图像(三十二)

Canvas提供了一个方法drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors,int colorffset,Paint paint) 这个方法可以对bitmap进行扭曲参数说明如下:bitmap     需要扭曲的源位图meshWidth   控制在横向上把该…

目录比较同步助手 Direetory Helper

Direetory Helper 详细介绍 Direetory Helper 是一个用JAVA可视化的目录文件同步助手&#xff0c;可以比较两个目录的结构不同&#xff0c;然后复制不同的数据进行同步。 程序运行需要JRE1.7运行环境。 应用场景&#xff1a; 1.相机卡里照了许多的照片&#xff0c;每次备份都不…