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

简介: MainActivity如下:package cc.c;import android.app.Activity;import android.
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>


相关文章
|
6月前
|
存储 算法 开发工具
OpenCV 安卓编程示例:1~6 全
OpenCV 安卓编程示例:1~6 全
149 0
|
15天前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
22 1
|
2月前
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
61 20
Android经典面试题之图片Bitmap怎么做优化
|
6月前
|
Android开发
Android通过手势(多点)缩放和拖拽图片
Android通过手势(多点)缩放和拖拽图片
51 4
|
6月前
|
Java Android开发
android 下载图片的问题
android 下载图片的问题
44 3
|
3月前
|
数据处理 开发工具 数据安全/隐私保护
Android平台RTMP推送|轻量级RTSP服务|GB28181接入之文字、png图片水印的精进之路
本文探讨了Android平台上推流模块中添加文字与PNG水印的技术演进。自2015年起,为了满足应急指挥及安防领域的需求,逐步发展出三代水印技术:第一代为静态文字与图像水印;第二代实现了动态更新水印内容的能力,例如实时位置与时间信息;至第三代,则优化了数据传输效率,直接使用Bitmap对象传递水印数据至JNI层,减少了内存拷贝次数。这些迭代不仅提升了用户体验和技术效率,也体现了开发者追求极致与不断创新的精神。
|
3月前
|
自然语言处理 定位技术 API
Android经典实战之如何获取图片的经纬度以及如何根据经纬度获取对应的地点名称
本文介绍如何在Android中从图片提取地理位置信息并转换为地址。首先利用`ExifInterface`获取图片内的经纬度,然后通过`Geocoder`将经纬度转为地址。注意操作需在子线程进行且考虑多语言支持。
218 4
|
3月前
|
XML 前端开发 Android开发
Android经典实战之Kotlin中实现圆角图片和圆形图片
本文介绍两种实现圆角图像视图的方法。第一种是通过自定义Kotlin `AppCompatImageView`,重写`onDraw`方法使用`Canvas`和`Path`进行圆角剪裁。第二种利用Android Material库中的`ShapeableImageView`,简单配置即可实现圆角效果。两种方法均易于实现且提供动态调整圆角半径的功能。
65 0
|
5月前
|
JSON 编解码 Apache
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
57 1
|
5月前
|
Java Android开发
18. 【Android教程】图片控件 ImageView
18. 【Android教程】图片控件 ImageView
79 4