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);
        }
    }
}

运行效果图

相关推荐
TeleostNaCl1 小时前
如何安装 Google 通用的驱动以便使用 ADB 和 Fastboot 调试(Bootloader)设备
android·经验分享·adb·android studio·android-studio·android runtime
fatiaozhang95272 小时前
中国移动浪潮云电脑CD1000-系统全分区备份包-可瑞芯微工具刷机-可救砖
android·网络·电脑·电视盒子·刷机固件·机顶盒刷机
萌虎不虎2 小时前
【鸿蒙(openHarmony)自定义音频播放器的开发使用说明】
华为·音视频·harmonyos
2501_915918413 小时前
iOS 开发全流程实战 基于 uni-app 的 iOS 应用开发、打包、测试与上架流程详解
android·ios·小程序·https·uni-app·iphone·webview
知来者逆3 小时前
视觉语言模型应用开发——Qwen 2.5 VL模型视频理解与定位能力深度解析及实践指南
人工智能·语言模型·自然语言处理·音视频·视觉语言模型·qwen 2.5 vl
lichong9513 小时前
【混合开发】vue+Android、iPhone、鸿蒙、win、macOS、Linux之dist打包发布在Android工程asserts里
android·vue.js·iphone
Android出海3 小时前
Android 15重磅升级:16KB内存页机制详解与适配指南
android·人工智能·新媒体运营·产品运营·内容运营
一只修仙的猿3 小时前
毕业三年后,我离职了
android·面试
max5006003 小时前
图像处理:实现多图点重叠效果
开发语言·图像处理·人工智能·python·深度学习·音视频