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描述:
 * 利用Bitmap.createBitmap()和Matrix实现图像
 * 的旋转,缩放,位移,倾斜.
 * 该方式的作用和mImageView.setImageMatrix(matrix);
 * 是一样的
 *
 * 备注说明:
 * 利用Bitmap.createBitmap()和Matrix的方式没有实现图像
 * 关于X轴,Y轴和XY的对称.
 * 明白怎么实现的coder请指点,多谢.
 *
 */
public class MainActivity extends Activity {
	private Bitmap mBitmap;
	private Bitmap mNewBitmap;
	private ImageView mImageView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }

    private void init(){
    	mImageView=(ImageView) findViewById(R.id.imageView);
    	mImageView.setScaleType(ImageView.ScaleType.MATRIX);

    	BitmapDrawable bitmapDrawable=(BitmapDrawable) mImageView.getDrawable();
    	mBitmap=bitmapDrawable.getBitmap();

    	//平移的两种方式,效果一致
    	//testTranslate1(mBitmap);
    	testTranslate2(mBitmap);

    	//围绕图片中心点旋转且位移的两种方式,效果一致
    	//testRotate1(mBitmap);
    	//testRotate2(mBitmap);

    	//围绕原点旋转后平移的两种方式,效果一致
    	//testRotateAndTranslate1(mBitmap);
    	//testRotateAndTranslate2(mBitmap);

    	//测试缩放的两种方式,效果一致
    	//testScale1();
    	//testScale2(mBitmap);

    	//测试倾斜各两种方式,效果一致
    	//testSkewX1();
    	//testSkewX2(mBitmap);
    	//testSkewY1();
    	//testSkewY2(mBitmap);
    	//testSkewXY1();
    	//testSkewXY2(mBitmap);

    	//测试对称
    	//testSymmetryX(mBitmap);
    	//testSymmetryY(mBitmap);
    	//testSymmetryXY(mBitmap);
    }

    //平移的方式一
	private void testTranslate1(Bitmap bitmap){
		Matrix matrix=new Matrix();
		int width=bitmap.getWidth();
		int height=bitmap.getHeight();
		matrix.postTranslate(width, height);
		mImageView.setImageMatrix(matrix);
	}

    //平移的方式二
	private void testTranslate2(Bitmap bitmap){
		Matrix matrix=mImageView.getImageMatrix();
		int width=bitmap.getWidth();
		int height=bitmap.getHeight();
		matrix.postTranslate(width, height);
		mNewBitmap=Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);
    	mImageView.setImageBitmap(mNewBitmap);
	}

	//围绕图片中心点旋转且位移的方式一
	private void testRotate1(Bitmap bitmap){
		Matrix matrix=new Matrix();
		int width=bitmap.getWidth();
		int height=bitmap.getHeight();
		matrix.postRotate(45f, width/2, height/2);
		matrix.postTranslate(width, height);
		mImageView.setImageMatrix(matrix);
	}

	//围绕图片中心点旋转且位移的方式二
	//注意问题:
	//在方式一种旋转45°采用matrix.postRotate(45f, width/2, height/2);即可
	//但在方式二中只需旋转22.5度matrix.postRotate(45/2f, width/2, height/2);
	private void testRotate2(Bitmap bitmap){
		Matrix matrix=mImageView.getImageMatrix();
		int width=bitmap.getWidth();
		int height=bitmap.getHeight();
		matrix.postRotate(45/2f, width/2, height/2);
		matrix.postTranslate(width, height);
		mNewBitmap=Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);
		mImageView.setImageBitmap(mNewBitmap);
	}

	//围绕原点旋转后平移的方式一
	private void testRotateAndTranslate1(Bitmap bitmap) {
		Matrix matrix = new Matrix();
		int width =bitmap.getWidth();
		int height = bitmap.getHeight();
		matrix.setRotate(45f);
		matrix.postTranslate(width, height);
		mImageView.setImageMatrix(matrix);
	}

	//围绕原点旋转后平移的方式二
	//注意问题:
	//同上
	private void testRotateAndTranslate2(Bitmap bitmap) {
		Matrix matrix = mImageView.getImageMatrix();
		int width =bitmap.getWidth();
		int height = bitmap.getHeight();
		matrix.setRotate(45/2f);
		matrix.postTranslate(width, height);
		mNewBitmap=Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);
    	mImageView.setImageBitmap(mNewBitmap);
	}

	//缩放的方式一
	private void testScale1() {
		Matrix matrix = new Matrix();
		matrix.setScale(0.5f, 0.5f);
		mImageView.setImageMatrix(matrix);
	}

	//缩放的方式二
	private void testScale2(Bitmap bitmap) {
		Matrix matrix = new Matrix();
		int width =bitmap.getWidth();
		int height = bitmap.getHeight();
		matrix.setScale(0.5f, 0.5f);
		mNewBitmap=Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);
    	mImageView.setImageBitmap(mNewBitmap);
	}

	//水平倾斜的方式一
	private void testSkewX1() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0.5f, 0);
		mImageView.setImageMatrix(matrix);
	}

	//水平倾斜的方式二
	private void testSkewX2(Bitmap bitmap) {
		Matrix matrix = new Matrix();
		int width =bitmap.getWidth();
		int height = bitmap.getHeight();
		matrix.setSkew(0.5f, 0);
		mNewBitmap=Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);
    	mImageView.setImageBitmap(mNewBitmap);
	}

	// 垂直倾斜的方式一
	private void testSkewY1() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0, 0.5f);
		mImageView.setImageMatrix(matrix);
	}

	// 垂直倾斜的方式二
	private void testSkewY2(Bitmap bitmap) {
		Matrix matrix = new Matrix();
		int width =bitmap.getWidth();
		int height = bitmap.getHeight();
		matrix.setSkew(0, 0.5f);
		mNewBitmap=Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);
    	mImageView.setImageBitmap(mNewBitmap);
	}

	// 水平且垂直倾斜的方式一
	private void testSkewXY1() {
		Matrix matrix = new Matrix();
		matrix.setSkew(0.5f, 0.5f);
		mImageView.setImageMatrix(matrix);
	}

	// 水平且垂直倾斜的方式二
	private void testSkewXY2(Bitmap bitmap) {
		Matrix matrix = new Matrix();
		int width =bitmap.getWidth();
		int height = bitmap.getHeight();
		matrix.setSkew(0.5f, 0.5f);
		mNewBitmap=Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);
    	mImageView.setImageBitmap(mNewBitmap);
	}

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

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

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

}

main.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:src="@drawable/a"
     />

</RelativeLayout>

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

时间: 2024-10-18 06:40:41

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

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图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——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清理设备内存详细完整示例(二)

MainActivity如下: package cc.c; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo;

Android图片的缩放效果

一.概述 Android 图片要实现:手势滑动,双击变大,多点触控的效果. 其实是有一定难度的,我们需要用Matrix ,GestureDetector 等等需要完成一个复杂的逻辑才能实现,然而今天我要说的并不是这种方法,而是一个第三方库Photoview,它使得完成图片缩放工作只需要3-5行代码就搞定了. 是不是很爽... 二.使用方法 github:https://github.com/chrisbanes/PhotoView 如果用AS需在引入如下库文件(目前是最新的): dependen

iOS transform解决连续多次旋转缩放,实现图片旋转缩放效果

一.需求 实现imageView的缩放旋转效果,一般有两种方式: 1.底层加scrollview,利用scrollview的属性实现. 2.利用手势,捏合手势.旋转手势等. 这里我选择的第二种:手势实现. 二.问题描述 一般手势处理后,对imageView进行transform处理,但我发现,每次获取手势再处理时,都会覆盖上一次的transform,从而达不到连续手势处理的效果. 比如: 我先放大一倍,再用手势放大,会发现图片会先回到原位,再放大,没有在第一次的放大位置基础继续方法,这不是我想要

Android 图片旋转

拍照后的照片有时被系统旋转,纠正步骤如下: 1.先读取图片文件被旋转的角度: /** * 通过ExifInterface类读取图片文件的被旋转角度 * @param path : 图片文件的路径 * @return 图片文件的被旋转角度 */ public static int readPicDegree(String path) { int degree = 0; // 读取图片文件信息的类ExifInterface ExifInterface exif = null; try { exif

Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53939176 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每天都有文章更新. 在本系列的上一篇文章中,我们学习了Glide的基本用法,体验了这个图片加载框架的强大功能,以及它非常简便的API.还没有看过上一篇文章的朋友,建议先去阅读 Android图片加载框架最全解析(一),Glide的基本用法 . 在多数情况下,我们想要在界面上加载并展示一

android 图片旋转 移动 放大缩小

图片的变化主要是matrix的变化,对matrix不懂的可以先了解下matrxi. public class FunnyView extends View { /* * 手指按下时可能是移动 也可能是拖动 */ private static final int ZOOM = -1 ; private static final int DRAG = 1; private int mode = 0; // 第一个触控点 private PointF startPointF = new PointF

android图片拖动缩放

这篇图片拖拽缩放也是我在项目中用到的,今天整理一下,将源码奉献给大家,希望对大家以后碰到相似的问题有帮助.android 大图片拖拽缩放 这篇就不做过多介绍了,直接上源码: 1 public class SpacePageActivity extends Activity { 2 3 private LinearLayout linnerLayout_spacepage; 4 private RelativeLayout relativeLayout_spacepage; 5 private B