系统绘图真相:这篇博客是专门讲解,系统内部是如何控制图片的变化,例如:图片缩放/图片旋转/图片平移/等等
注意:??在真实开发过程中:关于图片的 图片缩放/图片旋转/图片平移/等等 操作 是使用动画Animation
使用动画Animation去操作图片的 图片缩放/图片旋转/图片平移/等等,内部的封装和我这篇博客有关
在上一篇博客,Android-图像原理/绘制原理,讲解到绘图原理中,画布 + 画笔??? 需要最基本的两个要素,才能绘制出图像;
知道了 画布 + 画笔??? 这两个要素能够绘制图像后,还需要明白绘图规则:
绘图规则:
1.在指定的图片上操作,必须要指定好在哪张图片上操作;
2.必须要给一张空白的图片,然后操作图片;
3.操作图片完成?后,需要获取结果,操作后的结果就是空白图片
MyImageChangeActivity.java
package liudeli.my_media1; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.ImageView; import android.widget.Toast; import java.io.File; /** * 注意:?? 这是系统内部是如何控制图片的变化,例如:图片缩放/图片旋转/图片平移/等等 * 是执行动画Animation,内部的封装代码 */ public class MyImageChangeActivity extends Activity { private ImageView imageView; // 原始图片,原图 private Bitmap bitmap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_image_change); imageView = findViewById(R.id.image_view); initImage(); } /** * 初始化原始图片 */ private void initImage() { /** * 给ImageView设置图片显示 */ File file = new File(Environment.getExternalStorageDirectory(), "mm.jpg"); if (!file.exists()) { Toast.makeText(this, file.getName() + "不存在", Toast.LENGTH_SHORT).show(); return; } /** * 原始图片 */ bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); imageView.setImageBitmap(bitmap); } /** * 旋转图片 * @param view */ public void rotateAction(View view) { /** * 绘图原理中,画布 + 画笔??? 需要最基本的这两个要素,才能绘制出图像; * * 知道了 画布 + 画笔??? 这两个要素能够绘制图像后,还需要明白绘图规则: * * 绘图规则: * 1.在指定的图片上操作,必须要指定好在哪张图片上操作; * * 2.必须要给一张空白的图片,然后操作图片; * * 3.操作图片完成?后,需要获取结果,操作后的结果就是空白图片 */ /** * 2.创建一张空白图片 * 参数一:空白图片的宽度,就拿原始图片的宽度 * 参数二:空白图片的高度,就拿原始图片的高度 * 参数三:空白图片的配置信息,就拿原始图片的配置信息 */ Bitmap newImage = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); // 拿一块新的画布,把空白图片和画布关联 Canvas canvas = new Canvas(newImage); // 设置画布的背景 canvas.drawColor(Color.WHITE); // 拿一只新的画笔 Paint paint = new Paint(); // 注意:? Matrix集结了非常复杂的高等数学运算,操作图片的 图片缩放/图片旋转/图片平移/等等 都是Matrix来计算运算的 Matrix matrix = new Matrix(); // 参数一:旋转180就倒转过来了, 参数二:往中心点旋转, 参数三:往中心点旋转 matrix.postRotate(180, bitmap.getWidth() / 2, bitmap.getHeight() / 2); /** * 1.在指定的图片上操作,必须要指定好在哪张图片上操作; */ canvas.drawBitmap(bitmap, matrix, paint); /** * 3.操作图片完成?后,需要获取结果,操作后的结果就是空白图片 */ imageView.setImageBitmap(newImage); } /** * 缩放图片 * @param view */ public void scaleAction(View view) { /** * 绘图原理中,画布 + 画笔??? 需要最基本的这两个要素,才能绘制出图像; * * 知道了 画布 + 画笔??? 这两个要素能够绘制图像后,还需要明白绘图规则: * * 绘图规则: * 1.在指定的图片上操作,必须要指定好在哪张图片上操作; * * 2.必须要给一张空白的图片,然后操作图片; * * 3.操作图片完成?后,需要获取结果,操作后的结果就是空白图片 */ /** * 2.创建一张空白图片 * 参数一:空白图片的宽度,就拿原始图片的宽度 * 参数二:空白图片的高度,就拿原始图片的高度 * 参数三:空白图片的配置信息,就拿原始图片的配置信息 */ Bitmap newImage = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); // 拿一块新的画布,把空白图片和画布关联 Canvas canvas = new Canvas(newImage); // 设置画布的背景 canvas.drawColor(Color.WHITE); // 拿一只新的画笔 Paint paint = new Paint(); // 注意:? Matrix集结了非常复杂的高等数学运算,操作图片的 图片缩放/图片旋转/图片平移/等等 都是Matrix来计算运算的 Matrix matrix = new Matrix(); // 参数一:X轴缩放1.5 参数二:Y轴缩放0.5 matrix.postScale(1.5f, 0.5f); /** * 1.在指定的图片上操作,必须要指定好在哪张图片上操作; */ canvas.drawBitmap(bitmap, matrix, paint); /** * 3.操作图片完成?后,需要获取结果,操作后的结果就是空白图片 */ imageView.setImageBitmap(newImage); } /** * 平移图片 */ public void translateAction(View view) { /** * 绘图原理中,画布 + 画笔??? 需要最基本的这两个要素,才能绘制出图像; * * 知道了 画布 + 画笔??? 这两个要素能够绘制图像后,还需要明白绘图规则: * * 绘图规则: * 1.在指定的图片上操作,必须要指定好在哪张图片上操作; * * 2.必须要给一张空白的图片,然后操作图片; * * 3.操作图片完成?后,需要获取结果,操作后的结果就是空白图片 */ /** * 2.创建一张空白图片 * 参数一:空白图片的宽度,就拿原始图片的宽度 * 参数二:空白图片的高度,就拿原始图片的高度 * 参数三:空白图片的配置信息,就拿原始图片的配置信息 */ Bitmap newImage = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig()); // 拿一块新的画布,把空白图片和画布关联 Canvas canvas = new Canvas(newImage); // 设置画布的背景 canvas.drawColor(Color.WHITE); // 拿一只新的画笔 Paint paint = new Paint(); // 注意:? Matrix集结了非常复杂的高等数学运算,操作图片的 图片缩放/图片旋转/图片平移/等等 都是Matrix来计算运算的 Matrix matrix = new Matrix(); // 参数一:往X轴移动20个像素 参数二:往Y轴移动32个像素 matrix.postTranslate(20, 32); /** * 1.在指定的图片上操作,必须要指定好在哪张图片上操作; */ canvas.drawBitmap(bitmap, matrix, paint); /** * 3.操作图片完成?后,需要获取结果,操作后的结果就是空白图片 */ imageView.setImageBitmap(newImage); } /** * 刷新界面,自己跳转自己, 自己跳转自己为什么不怕多次进栈呢,因为设置来启动模式singleTop * @param view */ public void updateActivity(View view) { startActivity(new Intent(this, MyImageChangeActivity.class)); } /** * Activity被重用了,会调用此方法 * @param intent */ @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); initImage(); } }
MyImageChangeActivity.java 的 布局文件 activity_my_image_change.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="旋转" android:onClick="rotateAction" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="缩放" android:onClick="scaleAction" android:layout_centerHorizontal="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="平移" android:onClick="translateAction" android:layout_alignParentRight="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="updateActivity" android:text="刷新界面" android:layout_marginTop="46dp" /> <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="300dp" android:layout_centerInParent="true"/> </RelativeLayout>
AndroidManifest.xml
<!-- 设置启动模式,如果Activity在顶端,不会进栈 android:launchMode="singleTop" --> <activity android:name=".MyImageChangeActivity" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
效果: