当前位置: 首页 > news >正文

Android Studio(Compose 第四课--图片组件)


本章学习新的组件,帮我我们随心所欲添加自己的图片。

第一步:导入图片 (Resource Manager)

这是 AS 提供的一个很方便的工具。

  1. 准备一张图片(格式最好是 png 或 jpg),随便找一张电脑里的图,或者去网上搜个简单的图标。

  2. 在 Android Studio 左侧的项目目录中,找到res(Resources)文件夹。

  3. 展开res,找到drawable文件夹。

  4. 最简单的操作:直接把你的图片文件(比如logo.png),复制 (Ctrl+C),然后对着drawable文件夹粘贴 (Ctrl+V)

  5. ⚠️ 注意:弹出的对话框里,文件名必须全是小写字母(不能有大写!不能有空格!),比如my_logo.png是对的,My Logo.png会报错。

  6. 点击 OK。

第二步:写代码显示图片

新增代码(Image组件),将Image组件放到Column组件中,位置可以按自己的需求来

// === 新增的代码开始 === Image( // R.drawable.mylogo 对应你刚才复制进去的文件名,res(Resource)/drawable/mylogo // R 是 Resource(资源) 的缩写,AS 会自动生成这个索引 painter = painterResource(id = R.drawable.mylogo), contentDescription = "App Logo", // 给盲人读屏软件用的描述,必填(或者填 null) // 我们可以给图片加个修饰符,限制一下大小 modifier = Modifier .size(100.dp) // 大小 100dp .clip(CircleShape) // ✂️ 裁剪成圆形!(选做,如果不加就是原图矩形) ) // === 新增的代码结束 ===

三、完整代码

package com.example.myapplication import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.Button import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.example.myapplication.ui.theme.MyApplicationTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() //setContent { ... }: 这就是 C 语言里的 main() 入口。程序一运行,就执行这里面的 UI 函数。 setContent { //MyApplicationTheme,不是绝对必要,删了也能跑,它定义了你 App 的主题,以及深浅色主题的自动切换。 MyApplicationTheme { //Scaffold,标准页面模版,预留好了标准位置:顶部应用栏、底部导航栏、悬浮按钮等等; //即使什么栏都不加,Scaffold也能给你一个标准的白色/深色背景,并管理好屏幕布局。 //Modifier,修饰符,决定了样式和布局; //Modifier.fillMaxSize(),“填满”fillMaxSize(); //innerPadding,为Scaffold的一个特别功能,能自动适应手机参数, //因为在实际应用当中,我们的背景应该是不包括最顶部或者最底部的状态栏的,否则(0,0)的字会嵌入到电池电量那一栏中; //所以Scaffold会自动识别预留出安全距离,使得背景和文字不被覆盖,把这个参数innerPadding传给子函数,告诉他们; Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> Greeting( modifier = Modifier.padding(innerPadding) ) } } } } } //@Composable:这就好比告诉编译器:“这个函数不是用来做数学计算的,而是用来画界面的”。 // 这是一个自定义函数,但在 Compose 里叫 "Composable" @Composable fun Greeting(modifier: Modifier = Modifier) { // 注意:把 name 参数去掉了,我们在内部定义它 // 定义一个状态,用来存用户输入的名字 // 初始值是空字符串 "" var name by remember { mutableStateOf("") } Column( modifier = modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { // === 新增的代码开始 === Image( // R.drawable.mylogo 对应你刚才复制进去的文件名,res(Resource)/drawable/mylogo // R 是 Resource(资源) 的缩写,AS 会自动生成这个索引 painter = painterResource(id = R.drawable.mylogo), contentDescription = "App Logo", // 给盲人读屏软件用的描述,必填(或者填 null) // 我们可以给图片加个修饰符,限制一下大小 modifier = Modifier .size(100.dp) // 大小 100dp .clip(CircleShape) // ✂️ 裁剪成圆形!(选做,如果不加就是原图矩形) ) // === 新增的代码结束 === // 显示内容 // 如果名字是空的,就显示 "陌生人",否则显示名字 // 这里用了一个简单的 if/else 逻辑 val showName = if (name.isNotEmpty()) name else "陌生人" Text( text = "你好,$showName", style = MaterialTheme.typography.headlineMedium // 加个样式,让字大一点 ) // 加点空隙,别挨太近 Spacer(modifier = Modifier.height(20.dp)) // 输入框组件 OutlinedTextField( value = name, // 输入框里显示的文字,绑定到我们的变量,输入框组件内置会实时显示“value” // onValueChange,顾名思义,当输入框内的值改变的时候调用这个函数,即为一个中断回调函数 onValueChange = { newText -> // 回调函数:每当你敲一个键盘,这里就会执行 // newText 就是输入框里最新的内容 name = newText // 更新状态 -> 触发界面刷新 }, label = { Text("请输入你的名字") } // 输入框左上角的小提示 ) } } //这里大概就是预览器吧,在编辑器里使用模拟器预览,需要用到,实际在真实手机上,这一段可以删去 @Preview(showBackground = true) @Composable fun GreetingPreview() { MyApplicationTheme { Greeting() } }
http://www.jsqmd.com/news/632498/

相关文章:

  • 【Linux 网络】应用层自定义协议和序列化
  • 共识正在杀死你的公司,AI时代需要新的决策逻辑
  • 2026年口碑好的拉杆定制工厂/东莞钓鱼箱拉杆/拉杆开发定制厂家实力参考 - 行业平台推荐
  • 我试了四种去除 Gemini 水印的方法,整理成一篇实用对比牙
  • 编程新手福音:IQuest-Coder-V1微调教程,轻松适配嵌入式开发场景
  • flask vue
  • 2026证监会量化新规下:量化交易app、量化交易从入门到精通、量化交易平台、量化交易是怎么操作的、量化交易的简单解释选择指南 - 优质品牌商家
  • [AI/应用/MCP] MCP Server/Tool 开发指南澈
  • 2026年热门的丝杆升降机原理/进口丝杆升降机/SWL丝杆升降机厂家信誉综合参考 - 品牌宣传支持者
  • Wan2.2-I2V-A14B开发入门:C++高性能推理服务封装教程
  • 华为OD机试真题 新系统2026-04-08 C++实现【配置操作失败数量统计】
  • Java比较器:Comparable与Comparator的深入解析
  • macos简单配置openclaw厥
  • XSCT concle 连接三部曲
  • GPEN老照片修复全流程:科哥版从启动到保存,完整操作演示
  • 2026年4月,优质净水设备生产厂家推荐及技术要点,反渗透膜/净水设备/混床设备/净水机,净水设备厂商口碑推荐 - 品牌推荐师
  • **梯度压缩实战:用PyTorch实现高效分布式训练中的通信优化**在大规模深度学习模型训练中,**梯度通信开销**往往成为性能瓶
  • 2026年质量好的双边丝防护网/足球防护网/篮球场防护网精选厂家 - 行业平台推荐
  • DeOldify开源镜像部署指南:UNet模型开箱即用,5分钟完成GPU环境配置
  • Wan2.1视频生成实战:用提示词模板快速创作电影级短片
  • 零基础玩转Qwen3.5-9B-AWQ-4bit:开箱即用的图片识别与问答工具
  • 2026年质量好的一字型淋浴房/淋浴房/F型淋浴房/卫生间淋浴房实力厂家推荐 - 品牌宣传支持者
  • 2026年评价高的伺服电动推杆/工业电动推杆品牌厂商推荐(更新) - 行业平台推荐
  • 蒸馏:全员skill的职场恐怖故事
  • 2026年口碑好的电驱动升降平台/液压升降平台/电动升降平台/自行走升降平台公司精选 - 品牌宣传支持者
  • Qwen2.5-VL网络通信优化:降低延迟的关键技术
  • Java深拷贝与浅拷贝:概念解析与实现方式
  • 干支纪日
  • SDD基于规范编程-OpenSpec及SuperPowers复
  • 2026年第二季度可靠彩色透水混凝土厂家推荐:砾石聚合物地坪厂家/透水地坪厂家哪家好/透水地坪罩面剂厂家/透水材料混凝土厂家/选择指南 - 优质品牌商家