Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix

MainActivity例如以下:

import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.app.Activity;
import android.graphics.Matrix;
/**
 * Demo描写叙述:
 * 利用mImageView.setImageMatrix(matrix)实现
 * 图片的平移,缩放,旋转,倾斜以及对称
 *
 * 參考资料:
 * 0 http://blog.csdn.net/pathuang68/article/details/6991988
 * 1 http://blog.csdn.net/mingli198611/article/details/7830633
 *
 * Thank you very much
 */
public class MainActivity extends Activity {
    private TestMatrixImageView mTestMatrixImageView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mTestMatrixImageView=new TestMatrixImageView(MainActivity.this);
		mTestMatrixImageView.setScaleType(ImageView.ScaleType.MATRIX);//?

?
		mTestMatrixImageView.setOnTouchListener(new TouchListenerImpl());
		setContentView(mTestMatrixImageView);
	}

	private class TouchListenerImpl implements OnTouchListener{
		@Override
		public boolean onTouch(View v, MotionEvent event) {
			if (event.getAction()==MotionEvent.ACTION_UP) {
				//1 測试平移
				testTranslate();
				//2 測试环绕图片中心点旋转
				//testRotate();
				//3 測试环绕原点旋转后平移
				//testRotateAndTranslate();
				//4 缩放
				//testScale();
				//5 水平倾斜
				//testSkewX();
				//6 垂直倾斜
				//testSkewY();
				//7 水平且垂直倾斜
				//testSkewXY();
				//8 水平对称
				//testSymmetryX();
				//9 垂直对称
				//testSymmetryY();
				//10 关于X=Y对称
				//testSymmetryXY();
			}
			return true;
		}

	}

	//平移
	private void testTranslate(){
		Matrix matrix=new Matrix();
		int width=mTestMatrixImageView.getBitmap().getWidth();
		int height=mTestMatrixImageView.getBitmap().getHeight();
		matrix.postTranslate(width, height);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}
	//环绕图片中心点旋转
	private void testRotate(){
		Matrix matrix=new Matrix();
		int width=mTestMatrixImageView.getBitmap().getWidth();
		int height=mTestMatrixImageView.getBitmap().getHeight();
		matrix.postRotate(45f, width/2, height/2);
		matrix.postTranslate(width, height);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}

	//环绕原点旋转后平移
	//注意下面三行代码的运行顺序:
	//matrix.setRotate(45f);
	//matrix.preTranslate(-width, -height);
	//matrix.postTranslate(width, height);
	//先运行matrix.preTranslate(-width, -height);
	//后运行matrix.setRotate(45f);
	//再运行matrix.postTranslate(width, height);
	private void testRotateAndTranslate() {
		Matrix matrix = new Matrix();
		int width = mTestMatrixImageView.getBitmap().getWidth();
		int height = mTestMatrixImageView.getBitmap().getHeight();
		matrix.setRotate(45f);
		matrix.preTranslate(-width, -height);
		matrix.postTranslate(width, height);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}

	//缩放
	private void testScale() {
		Matrix matrix = new Matrix();
		matrix.setScale(0.5f, 0.5f);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}

	//水平倾斜
	private void testSkewX() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0.5f, 0);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}

	// 垂直倾斜
	private void testSkewY() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0, 0.5f);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}

	// 水平且垂直倾斜
	private void testSkewXY() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0.5f, 0.5f);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}

	// 水平对称--图片关于X轴对称
	private void testSymmetryX() {
		Matrix matrix = new Matrix();
		int height = mTestMatrixImageView.getBitmap().getHeight();
		float matrixValues[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };
		matrix.setValues(matrixValues);
		//若是matrix.postTranslate(0, height);
		//表示将图片上下倒置
		matrix.postTranslate(0, height*2);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}

	// 垂直对称--图片关于Y轴对称
	private void testSymmetryY() {
		Matrix matrix = new Matrix();
		int width=mTestMatrixImageView.getBitmap().getWidth();
		float matrixValues[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};
		matrix.setValues(matrixValues);
		//若是matrix.postTranslate(width,0);
		//表示将图片左右倒置
		matrix.postTranslate(width*2, 0);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);

	}

	// 关于X=Y对称--图片关于X=Y轴对称
	private void testSymmetryXY() {
		Matrix matrix = new Matrix();
		int width = mTestMatrixImageView.getBitmap().getWidth();
		int height = mTestMatrixImageView.getBitmap().getHeight();
		float matrixValues[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };
		matrix.setValues(matrixValues);
		matrix.postTranslate(width+height, width+height);
		mTestMatrixImageView.setImageMatrix(matrix);
		showMatrixEveryValue(matrix);
	}

	//获取变换矩阵Matrix中的每一个值
	private void showMatrixEveryValue(Matrix matrix){
		float matrixValues []=new float[9];
		matrix.getValues(matrixValues);
		for (int i = 0; i <3; i++) {
			String valueString="";
			for (int j = 0; j < 3; j++) {
				valueString=matrixValues[3*i+j]+"";
				System.out.println("第"+(i+1)+"行的第"+(j+1)+"列的值为"+valueString);
			}
		}
	}

}

TestMatrixImageView例如以下:

package cn.testmatrix;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.widget.ImageView;
/**
 * 总结:
 * 在MainActivity中运行:
 * mTestMatrixImageView.setImageMatrix(matrix);
 * 时此自己定义View会先调用setImageMatrix(Matrix matrix)
 * 然后调用onDraw(Canvas canvas)
 */
public class TestMatrixImageView extends ImageView{
	private Matrix mMatrix;
    private Bitmap mBitmap;
	public TestMatrixImageView(Context context) {
		super(context);
		mMatrix=new Matrix();
		mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.icon);
	}
	@Override
	protected void onDraw(Canvas canvas) {
		System.out.println("---> onDraw");
		//画原图
		canvas.drawBitmap(mBitmap, 0, 0, null);
		//画经过Matrix变化后的图
		canvas.drawBitmap(mBitmap, mMatrix, null);
		super.onDraw(canvas);
	}
	@Override
	public void setImageMatrix(Matrix matrix) {
		System.out.println("---> setImageMatrix");
		this.mMatrix.set(matrix);
		super.setImageMatrix(matrix);
	}

	public Bitmap getBitmap(){
		System.out.println("---> getBitmap");
		return mBitmap;
	}

}

main.xml例如以下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>
时间: 2024-12-19 19:53:39

Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix的相关文章

Android图片旋转,缩放,位移,倾斜,对称完整示例(二)——Bitmap.createBitmap()和Matrix

MainActivity如下: package cc.c; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.widget.ImageView; /** * Demo描述: * 利用B

Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix

MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.app.Activity; import android.graphics.Matrix; /** * Demo描述:

将 Android* x86 NDK 用于 Eclipse* 并移植 NDK 演示样例应用

目标 面向 Eclipse (ADT) 的 Android 插件如今支持基于 NDK 的应用开发. 其可自己主动生成项目和构件文件以及代码存根,并可集成到整个 Android 应用开发中(构建原生库.将库拷贝到项目内的对应 JNI 目录.将应用打包以及生成带有 NDK 代码的终于 APK). 本文将讨论怎样配置 Eclipse 以利用该功能.并示范移植 NDK 应用的演示样例. 配置 Eclipse ADT 插件以配合 NDK 使用 必须先配置 Eclipse ADT 插件指向 NDK 安装路径

Android清理设备内存具体完整演示样例(一)

MainActivity例如以下: package come.on; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;

Android利用Volley异步载入数据完整具体演示样例(二)

MainActivity例如以下: package cc.y; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.os.Bundle; import android.util.LruCache; import android.widget.ImageVie

Android模糊演示样例-RenderScript-附效果图与代码

本文链接    http://blog.csdn.net/xiaodongrush/article/details/31031411 參考链接    Android高级模糊技术    http://stackoverflow.com/questions/14879439/renderscript-via-the-support-library 1. 程序截图     拖动红色区域,能够显示出清晰的汽车部分. 拖动以下的滑块,能够更改模糊程度.       watermark/2/text/aHR

Android之——多线程下载演示样例

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明白要求将耗时的操作放到一个子线程中运行,文件的下载无疑是须要耗费时间的.所以要将文件的下载放到子线程中运行. 以下,我们一起来实现一个Android中利用多线程下载文件的小样例. 二.服务端准备 在这个小样例中我下面载有道词典为例.在网上下载有道词典的安装包,在eclipse中新建项目web.将下载

CountDownTimer完整具体演示样例

MainActivity例如以下: package cc.cv; import android.os.Bundle; import android.os.CountDownTimer; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; /** * Demo演示样例: * CountDownTim

10分钟理解Android数据库的创建与使用(附具体解释和演示样例代码)

1.Android数据库简单介绍. Android系统的framework层集成了Sqlite3数据库.我们知道Sqlite3是一种轻量级的高效存储的数据库. Sqlite数据库具有以下长处: (1)零配置,无需安装和配置: (2)储存在单一磁盘文件里的一个完整的数据库. (3)数据库文件能够在不同字节顺序的机器间自由共享: (4)支持数据大小至2TB: (5)足够小.全部源码大致3万行C代码.250KB: (6)比眼下流行的大多数数据库的操作要快. (7)开源. 2.Sqlite 基本操作语句