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

news2024/9/24 15:22:27

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

布局xml

<?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


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


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

运行效果图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1701426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通配符证书和多域名证书主要区别以及如何选择

一、通配符证书与多域名证书的主要区别 1.覆盖域名范围 通配符证书可以保护一个主域名及其所有二级子域名&#xff0c;并对该级子域名数量无限制。这种特性使得通配符证书在拥有大量子域名的网站上非常受欢迎&#xff0c;可以大大简化证书管理和维护工作。 多域名证书允许在…

基于ChatGPT+RPA的融资融券业务担保资产风险评价

原载《会计之友》2024年第2期 作者简介 李闻一 男&#xff0c;湖北洪湖人&#xff0c;华中师范大学经济与工商管理学院教授、博士生导师&#xff0c;会计学科带头人&#xff0c;研究方向&#xff1a;财务共享、公司金融、风险管理 黄怡凡 女&#xff0c;湖北公安人&#xf…

2024中青杯数学建模竞赛A题人工智能视域下养老辅助系统的构建思路代码论文分析

2024中青杯数学建模A题论文和代码已完成&#xff0c;代码为A题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型的评价…

Appium系列(2)元素定位工具appium-inspector

背景 如实现移动端自动化&#xff0c;依赖任何工具时&#xff0c;都需要针对于页面中的元素进行识别&#xff0c;通过识别到指定的元素&#xff0c;对元素进行事件操作。 识别元素的工具为appium官网提供的appium-inspector。 appium-inspector下载地址 我这里是mac电脑需要下…

C#子窗体嵌入主窗体

上位机开发中&#xff0c;经常会需要将子窗体嵌入到主窗体。 运行结果 核心实现&#xff1a; private void button2_Click(object sender, EventArgs e){Form3 childForm new Form3();//判断容器中是否已经打开子窗体&#xff0c;如果打开现将其关闭foreach (Control item in…

【C++】Vector的简易模拟与探索

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

并查集详解及实现

看完这篇文章你将会知道&#xff1a; 什么是并查集&#xff1f; 并查集的原理。 并查集的JAVA实现。 并查集这部分内容还是很简单的&#xff0c;相信只要认真学&#xff0c;你正在上小学二年级的表弟都能学得会。(▽ʃ♡ƪ) 目录 一、啥是并查集&#xff1f; 二、并查集的…

什么样的展馆场馆才是科技满满?就差一张智慧场馆大屏

随着科技的飞速发展&#xff0c;传统的场馆展示方式已经无法满足现代人对信息获取和体验的需求。智慧场馆大屏作为一种新型的展示方式&#xff0c;应运而生。它将高清大屏显示技术、智能交互技术、数据分析技术等融为一体&#xff0c;为观众带来更加丰富、生动的展示体验。 一…

跨境热销爆款货源哪里找?选品工具不能少

通常&#xff0c;跨境电商找热销货源的几种方法&#xff1a; 1、使用Google Trends、亚马逊销售排行等来追踪和分析当前的市场趋势和热门产品&#xff1b; 2、关注社交媒体、行业论坛和博客等渠道&#xff0c;以获取最新的市场信息和消费者反馈&#xff1b; 3、在主流的跨境…

python-编写函数判断一个三位数是否为水仙花数。

【问题描述】要求编写函数isflower(n)判断一个三位数n是否为水仙花数,如果是&#xff0c;则返回True&#xff0c;否则返回False。在主程序中要求调用该函数并输出三位数中所有的水仙花数。所谓"水仙花数"是指一个3位数&#xff0c;其各位数字立方和等于该数本身。例如…

【动态规划】零基础解决路径问题(C++)

目录 62.路径问题 解法&#xff08;动态规划&#xff09;&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a; 4. 填表顺序&#xff1a; 5. 返回值&#xff1a; 不同路径2.0 解法&#xff08;动态规划&#xff09;&#xff1a; …

MySQL——存储过程,触发器

BaiduComate: # 问题1&#xff1a; # 问题1&#xff1a; 帮我创建两个表student与score表&#xff0c;要求student表有id&#xff0c;createDate&#xff0c;userName&#xff0c;phone&#xff0c;age&#xff0c;sex&#xff0c;introduce&#xff0c; 要求score表有id&…

迷你手持小风扇哪个牌子质量好点?这五款迷你手持小风扇不要错过

随着空调的普及&#xff0c;我们对夏日热浪的抵抗力逐渐减弱。当从凉爽的空调屋步入闷热的户外、拥挤的交通工具或公共场所时&#xff0c;如何抵御热浪的侵袭成为大众关注的焦点。在这样的背景下&#xff0c;迷你手持小风扇凭借其便携性和即时降温功能&#xff0c;成为众多人的…

和可被k整除的子数组 ---- 前缀和

题目链接 题目: 分析: 补充知识 1. 同余定理: (a-b) % p 0即a-b能被p整除, > a % p b % p 2. c, java中 [负数 % 正数] 的结果是负数, 想要得到正确结果 > (a%pp)%p这道题和<和为k的子数组>类似, 利用前缀和的思想, 计算以i结尾的所有子数组, 前缀和为sum[i] …

炸裂!AI五分钟模仿爆款IP故事,涨粉速度太绝了!

‍ ‍大家好&#xff0c;我是向阳。 今天我要分享一个利用AI技术模仿爆款账号的小技巧&#xff0c;帮助大家迅速增加粉丝。这个方法简单实用&#xff0c;尤其适用于副业和本地生活领域。接下来&#xff0c;我将为大家详细讲解操作步骤。让我们开始吧。 副业赚钱&#xff1a;模…

QT 程序缺少API-开头文件

无法启动此程序&#xff0c;因为计算机中丢失api-ms-win-core-rtlsupport-11-2-0dl。尝试重新安装该程序以解决此问题 因为打包QT程序经常去到的别的电脑会缺少系统的MFC开头 msvcp 的库所以&#xff0c;QT自带的VC安装包体验不够好所以都是自己本地复制一套进行打包。。 有部…

LVDS与IDELAY

摘要&#xff1a;LVDS&#xff08;Low-Voltage Differential Signaling&#xff09;低电压差分信号&#xff0c;是一种低功耗、低误码率、低串扰和低辐射的差分信号技术&#xff1b;LVDS会被经常使用到&#xff0c;使用的过程中难免会碰到时序问题&#xff0c;需要借助IDELAY进…

在看代码的时候,vscode使用书签快速跳转到想看的代码

安装bookmarks 重启vscode之后&#xff0c;摁F1 搜搜索“书签”&#xff0c;更改自己需要的快捷键&#xff0c;我这里更改了三个

生命在于学习——Python人工智能原理(1.2)

一、人工智能的基本知识 6、新一代人工智能驱动因素 &#xff08;1&#xff09;数据量爆发性增长。 &#xff08;2&#xff09;计算能力大幅提升 &#xff08;3&#xff09;深度学习等算法发展 &#xff08;4&#xff09;移动AI创新应用牵引 7、人工智能关键技术 &#x…

降价!免费!AI大模型开启价格战,企业如何“薅”出绿色财富?

近期&#xff0c;国内大模型技术供应商之间的价格战&#xff0c;使得这项原本成本较高的技术变得更加亲民&#xff0c;极大降低了企业的技术采用门槛。这不仅为企业提供了经济实惠的技术解决方案&#xff0c;更为他们的绿色低碳转型之路带来了新的机遇。 随着全球气候变化问题…