Android 音视频从入门到提高 -- 任务列表——task1

1.在 Android 平台绘制一张图片,使用至少3种不同的 APl,lmageView,SurfaceView,自定义 Vew

布局xml

java 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="250dp"
        tools:ignore="MissingConstraints">
        <TextView
            android:layout_width="match_parent"
            android:gravity="center"
            android:text="Task1.1使用ImageView展示图片"
            android:layout_height="wrap_content">
        </TextView>
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/task1">
        </ImageView>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="250dp"
        tools:ignore="MissingConstraints">
        <TextView
            android:layout_width="match_parent"
            android:gravity="center"
            android:text="Task1.2使用SurfaceView展示图片"
            android:layout_height="wrap_content">
        </TextView>
        <SurfaceView
            android:id="@+id/surface_task"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </SurfaceView>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="250dp"
        tools:ignore="MissingConstraints">
        <TextView
            android:layout_width="match_parent"
            android:gravity="center"
            android:text="Task1.3使用自定义的View展示图片"
            android:layout_height="wrap_content">
        </TextView>
        <com.yuyang.medialtaskone.view.MyOneView
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </com.yuyang.medialtaskone.view.MyOneView>
    </LinearLayout>

</LinearLayout>

activity

java 复制代码
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);

        //SurfaceView
        SurfaceView surfaceView = findViewById(R.id.surface_task);
        surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(@NonNull SurfaceHolder surfaceHolder) {
                if (surfaceHolder == null) {
                    return;
                }
                //绘画三件套 类似理解(纸、笔、尺)
                //TODO  画笔  位图  画布
                Paint paint = new Paint();
                paint.setAntiAlias(true);
                paint.setStyle(Paint.Style.STROKE);
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                        R.drawable.task1);
                // surfaceHolder锁定当前surfaceView的画布
                Canvas canvas = surfaceHolder.lockCanvas();
//                canvas.drawBitmap(bitmap, 0, 0, paint); //画图

                /**
                 * 这个画布直接画会出现,如果画布大小小于位图大小,那这张图就会
                 * 只画出画布那一点点内容
                 * 如何解决呢
                 * 可以把位图先按照画布的大小等比例缩放一下
                 * 按照画布那么大的尺寸来画图
                 * 实操一下
                 * */
                // 获取画布的宽度和高度
                int canvasWidth = canvas.getWidth();
                int canvasHeight = canvas.getHeight();

                // 计算位图的缩放比例
                float scaleWidth = (float) canvasWidth / bitmap.getWidth();
                float scaleHeight = (float) canvasHeight / bitmap.getHeight();

                // 创建缩放矩阵
                Matrix matrix = new Matrix();
                matrix.postScale(scaleWidth, scaleHeight);

                // 创建缩放后的位图
                Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);

                //画缩放后的图
                canvas.drawBitmap(scaledBitmap, 0, 0, paint);

                // 解除锁定并post在界面上
                surfaceHolder.unlockCanvasAndPost(canvas);

            }

            @Override
            public void surfaceChanged(@NonNull SurfaceHolder surfaceHolder, int i, int i1, int i2) {

            }

            @Override
            public void surfaceDestroyed(@NonNull SurfaceHolder surfaceHolder) {

            }
        });
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });
    }
}

自定义View

java 复制代码
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.Nullable;

import com.yuyang.medialtaskone.R;

public class MyOneView extends View {
    Paint paint = new Paint();
    Bitmap bitmap;
    public MyOneView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
         bitmap = BitmapFactory.decodeResource(getResources(),
                R.drawable.task1);


    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 不建议在onDraw做任何分配内存的操作
        if (bitmap != null) {
            // 获取画布的宽度和高度
            int canvasWidth = canvas.getWidth();
            int canvasHeight = canvas.getHeight();

            // 计算位图的缩放比例
            float scaleWidth = (float) canvasWidth / bitmap.getWidth();
            float scaleHeight = (float) canvasHeight / bitmap.getHeight();

            // 创建缩放矩阵
            Matrix matrix = new Matrix();
            matrix.postScale(scaleWidth, scaleHeight);

            // 创建缩放后的位图
            Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            canvas.drawBitmap(scaledBitmap, 0, 0, paint);
        }
    }
}

运行效果图

相关推荐
无极程序员36 分钟前
PHP常量
android·ide·android studio
萌面小侠Plus2 小时前
Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机
android·性能优化·kotlin·工具类·低端机
慢慢成长的码农2 小时前
Android Profiler 内存分析
android
大风起兮云飞扬丶2 小时前
Android——多线程、线程通信、handler机制
android
L72562 小时前
Android的Handler
android
清风徐来辽2 小时前
Android HandlerThread 基础
android
HerayChen3 小时前
HbuildderX运行到手机或模拟器的Android App基座识别不到设备 mac
android·macos·智能手机
顾北川_野3 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
hairenjing11233 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小黄人软件3 小时前
android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址
android·ide·android studio