Android-系统绘图真相

系统绘图真相:这篇博客是专门讲解,系统内部是如何控制图片的变化,例如:图片缩放/图片旋转/图片平移/等等

注意:??在真实开发过程中:关于图片的 图片缩放/图片旋转/图片平移/等等 操作 是使用动画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>

 

效果:

Android-系统绘图真相

 

 

 

    

 

Android-系统绘图真相

上一篇:javascript typeof用法小测


下一篇:C# Dapper 基本使用 增删改查事务等