admin 管理员组文章数量: 1184232
本文还有配套的精品资源,点击获取
简介:安卓开发中,优化用户界面体验包括为天气页面添加背景图片。本项目“酷欧天气(4)”将引导你通过布局文件和代码实现此功能,涉及资源管理、ImageView设置、动态图片加载、响应式设计、图片动画、内存优化、网络请求和动态更新、主题适配、测试与调试等方面。掌握这些技术要点能够显著提升你的安卓应用开发能力。
1. 安卓应用界面设计与布局
1.1 设计原则与布局类型
在设计Android应用界面时,重要的不仅仅是用户界面的美观,还要确保它直观、易用且具有良好的用户体验。开发者需要依据Google Material Design指南来创建一致且连贯的用户界面。其中,布局类型的选择是界面设计的核心部分,它决定了元素如何在屏幕上显示和排列。常见的布局类型包括线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)、网格布局(GridLayout)以及约束布局(ConstraintLayout)。
1.2 界面组件与布局属性
Android界面设计涉及多种组件,如按钮(Button)、文本框(TextView)、列表视图(ListView)等,这些组件需要通过布局来组织。每个布局组件都有其属性,例如边距(margin)、填充(padding)、宽度(width)和高度(height),这些属性的合理运用,直接影响到界面的布局效果。在XML布局文件中定义这些属性,设计师需要熟悉各种属性参数的含义,并通过实际效果不断调整,以达到预期设计。
1.3 设计流程与工具
Android应用界面的设计流程通常从需求分析开始,接着进行草图设计、布局编码,最后进行测试和优化。这个过程中,使用的设计工具如Android Studio内置的布局编辑器可以直观地构建和预览界面,它允许开发者以所见即所得(WYSIWYG)的方式设计界面。而像Sketch和Adobe XD这样的专业UI设计工具则可以在开发前帮助设计师创建高质量的界面原型。接下来的章节将深入探讨布局文件的操作与管理,以及如何优化布局来提升性能和用户体验。
2. 布局文件的操作与管理
2.1 布局文件的基本结构
2.1.1 XML布局文件的特点
在Android开发中,XML布局文件是用于定义应用用户界面的结构化文件。它们具有以下特点:
- 声明式描述 :通过XML元素声明界面的组件和布局属性,与编写Java代码相比,这种方式更加直观和易于理解。
- 层级结构 :XML布局文件中的界面元素具有层级关系,可以嵌套不同类型的布局组件,从而构建复杂的用户界面。
- 可维护性 :由于结构化和模块化设计,XML布局文件易于维护和扩展。开发者可以轻松地添加、删除或修改界面元素而不影响其他部分。
- 可复用性 :布局文件中的组件和布局可以被不同的Activity或Fragment复用,通过在XML文件中使用
<include>标签或创建自定义View来提高开发效率。
布局文件的基本结构通常包括根布局和子布局(子视图)。根布局可以是 LinearLayout 、 RelativeLayout 、 FrameLayout 等。例如,一个简单的 LinearLayout 布局文件结构如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:id="@+id/textView" />
<!-- 更多组件可以被添加到此布局中 -->
</LinearLayout>
每个组件,如 TextView ,都有自己的属性来定义其在界面中的行为和样式。
2.1.2 布局属性的设置与应用
布局属性允许开发者对组件的大小、位置、间距等进行配置。以下是一些常用的布局属性和它们的应用方法:
-
android:layout_width和android:layout_height:这两个属性用于设置组件的宽度和高度。常见的值有wrap_content、match_parent或具体的尺寸值(如100dp)。 -
android:orientation:设置线性布局(LinearLayout)中子视图的排列方向,常见的值有vertical和horizontal。 -
android:padding和android:margin:padding定义了组件内部与内容之间的空白区域,而margin定义了组件之间的空白区域。
例如,如果想要创建一个具有内边距的 Button ,可以这样设置属性:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me"
android:padding="16dp" />
在实际应用中,开发者还需要根据设计图或样式指南来调整布局属性,确保界面的一致性和用户体验。
2.2 布局优化与性能提升
2.2.1 流式布局与性能考量
流式布局(例如 LinearLayout )是一种常用的布局方式,它的性能考量通常涉及以下几点:
- 嵌套深度 :避免布局的深度嵌套,嵌套层数越多,渲染性能越低。
- 过度使用权重 :在
LinearLayout中,通过使用layout_weight属性可以实现灵活的宽度和高度分配,但过多依赖权重会增加布局的复杂度,影响性能。 - 优化视图可见性 :使用
View.GONE或View.INVISIBLE来控制视图的显示与隐藏,而不是在运行时动态地添加或删除视图,这样可以避免布局的重新计算。
例如,考虑以下布局:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="3">
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="Button 1" />
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="Button 2" />
<Button
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:text="Button 3" />
</LinearLayout>
在这个布局中,通过 layout_weight 分配了等宽的三个按钮,保持了布局的简洁和性能。
2.2.2 布局重用与include标签的使用
布局重用是Android布局优化的一个重要方面,它通过 <include> 标签实现。 <include> 标签允许开发者在一个布局文件中重复使用另一个布局文件,这样可以避免在多个地方复制相同的代码,从而减少维护成本和提高性能。
例如,如果有一个常用的头部布局 header_layout.xml ,可以在另一个布局文件中这样引用:
<include layout="@layout/header_layout" />
这个标签可以保留原始布局文件中的所有属性,并允许你为重用的布局指定ID,便于在代码中进行操作。
下面是一个使用 <include> 标签的实际例子:
<!-- 在activity_main.xml中 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/header_layout" />
<!-- 其他布局 -->
</LinearLayout>
<!-- 在header_layout.xml中 -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/logo" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="App Name" />
<!-- 更多头部组件 -->
</LinearLayout>
通过上述结构,开发者可以将 header_layout.xml 在多个活动中重用,而无需重复编写相同的布局代码,从而提高开发效率。
布局重用是Android应用开发中常见的性能优化手段之一,它减少了重复代码的编写,也使得布局的维护变得更加方便。在实际开发中,开发者应根据具体情况,合理地使用布局重用机制。
3. ImageView使用与图片设置技巧
3.1 ImageView基本属性和功能
3.1.1 ImageView的scaleType属性详解
在Android开发中, ImageView 是一个用于显示图片的组件,其 scaleType 属性控制着图片的缩放和定位方式。不同的 scaleType 值会对图片的展示方式产生重大影响,合理地使用 scaleType 属性可以帮助开发者更好地展示图片内容,适应不同的布局需求。
以下是 scaleType 的一些常用值及其效果:
-
center: 图片保持原有的大小,居中显示,不会被缩放,超出ImageView边界的部分会被裁剪。 -
centerInside: 图片保持原有的大小,居中显示,如果图片宽高大于ImageView则会被缩放以完全显示图片,可能会留下空白区域。 -
centerCrop: 图片保持宽高比缩放,缩放后的图片将完全覆盖ImageView的内容区域,超出ImageView边界的部分会被裁剪。 -
fitXY: 图片不保持宽高比地缩放,完全填充ImageView的整个内容区域。 -
fitStart和fitEnd: 保持宽高比地缩放,缩放后的图片会被放置在ImageView的开始或结束位置,留出空白区域。
为了演示 scaleType 的使用效果,下面是一段示例代码:
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/example_image"
android:scaleType="centerInside" />
在这个示例中,图片将根据 ImageView 的宽度进行缩放,以确保图片可以在宽度上适应 ImageView 的宽度,并且图片会居中显示。如果图片高度超过了 ImageView 的高度,则图片会相应地缩小高度以适应 ImageView 。
选择合适的 scaleType 是根据实际的布局需求和图片展示目的来决定的。例如,如果你希望图片完整地显示在 ImageView 中而不被裁剪,那么 centerInside 可能是一个好的选择;如果你希望图片完全填充 ImageView 并且可以接受图片被拉伸变形,那么 fitXY 就是更合适的选项。
3.1.2 图片资源的选择与适配
在Android应用开发中,图片资源的管理与适配是提升用户体验的关键。根据设备的屏幕密度和分辨率,开发者需要提供不同尺寸的图片资源以确保图片在所有设备上都能清晰地展示。
设备屏幕密度分类
Android 设备的屏幕密度被分类为以下几种:
-
ldpi(low) ~120dpi -
mdpi(medium) ~160dpi -
hdpi(high) ~240dpi -
xhdpi(extra-high) ~320dpi -
xxhdpi(extra-extra-high) ~480dpi -
xxxhdpi(extra-extra-extra-high) ~640dpi
适配资源文件夹
对于不同密度的设备,需要在项目的 res 目录下创建对应的资源文件夹:
-
drawable-ldpi -
drawable-mdpi -
drawable-hdpi -
drawable-xhdpi -
drawable-xxhdpi -
drawable-xxxhdpi
对于高分辨率设备,还可以提供 xxxhdpi 文件夹中的资源。如果不提供某些密度的图片资源,系统会根据需要进行缩放,但这样可能会导致图片变得模糊或者不够精细。
设计图片资源的注意事项
-
保持向量图形的灵活性 :对于图标和小图,推荐使用矢量图形(例如SVG或Android的vector drawable),因为它们可以无损地缩放到任何尺寸。
-
图片尺寸与性能 :过大的图片会消耗更多内存,导致应用运行缓慢。建议优化图片尺寸,使图片在不影响显示效果的情况下尽可能小。
-
使用不同的图片资源 :为不同的屏幕密度和方向提供适当的图片资源。对于不同的屏幕方向(纵向和横向),可能需要为
land和port文件夹提供不同的资源。 -
设计适应性布局 :考虑不同设备的屏幕尺寸,使用布局权重和适配性布局元素(如
wrap_content和match_parent)来设计布局。
代码块示例
假设有一个 ImageView 在纵向模式下的布局文件 res/layout-port 中定义如下:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/example_image"
android:contentDescription="@string/example_content_description" />
对应地,为了适配横向模式下的设备,可能需要在 res/layout-land 文件夹中为 ImageView 提供一个更合适的布局文件。如果横向布局需要图片占满整个屏幕,可以调整 layout_width 和 layout_height 属性为 match_parent 。
通过精心选择和适配图片资源,开发者可以确保其应用在多种设备上都能提供美观和高质量的用户体验。
4. 资源文件与动态图片加载
4.1 资源文件的组织与引用
4.1.1 资源文件的分类与存储规则
在Android开发中,资源文件是存放在 res 目录下的各类文件,用于提供界面布局、字符串、颜色、图片等资源。资源文件的分类和存储规则如下:
- drawables :存放图片资源,如
.png、.jpg、.xml等格式的图片。 - layouts :存放布局文件,XML格式定义了界面的结构。
- values :存放如字符串(
strings.xml)、颜色(colors.xml)、尺寸(dimens.xml)等。 - raw :存放原始文件,如音频、视频。
- assets :存放应用需要使用的静态文件,如HTML、CSS、JavaScript文件等。
存储规则上,Android对资源文件的命名有一定的要求。例如,图片资源命名时要避免使用大写字母,以防止在不同设备上显示不一致的问题。每个资源文件应尽量避免重复,以确保项目结构的清晰和维护的方便。
4.1.2 动态资源引用与管理
在Android应用中,动态资源引用通常涉及到运行时根据设备配置或应用状态切换不同的资源,例如:
- 根据不同屏幕尺寸提供不同的布局文件 :在
res目录下,可以为不同尺寸的屏幕创建不同的资源目录,如layout-large/、layout-xlarge/。 - 主题或样式切换 :使用资源引用动态地更换应用的UI元素,如主题、颜色和图片等。
动态资源引用主要依赖于 @ 符号,后跟资源的类型和名称。例如,引用一个图片资源可以写作 @drawable/my_image 。
4.2 图片加载库的运用
4.2.1 常用图片加载库的对比
在移动应用开发中,加载和展示图片是一个常见需求。Android系统原生提供的图片加载和缓存机制较为基础,因此开发者常常会使用第三方图片加载库以提高性能和用户体验。一些流行的图片加载库包括:
- Glide :快速、高效并且易于使用的图片加载库,支持图片的加载、缓存、转换等多种功能。
- Picasso :由Square公司开发,简单的API设计,支持图片的加载、裁剪、旋转等功能。
- Fresco :Facebook开发的图片加载库,特别优化了图片加载的性能,并且支持深层次的图片处理。
4.2.2 图片加载库的集成与配置
要集成上述任何一个图片加载库,需要在项目的 build.gradle 文件中添加对应的依赖项。以下是以Glide为例的集成方法:
dependencies {
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}
集成后,需要在应用的 AndroidManifest.xml 中添加必要的权限,比如网络权限,因为Glide等库在加载网络图片时需要访问网络:
<uses-permission android:name="android.permission.INTERNET" />
代码实现动态加载图片示例:
Glide.with(context)
.load("https://example/image.jpg")
.into(imageView)
该段代码通过Glide库从指定URL加载图片,并显示在 imageView 控件中。Glide自动处理图片的缓存,避免不必要的网络请求,并优化了内存和磁盘的使用。
5. 图片动画效果与响应式设计实践
5.1 图片动画效果的应用
5.1.1 Android中的动画类型与实现
在Android开发中,动画的实现可以让应用界面更加生动有趣,提升用户体验。Android提供了几种不同的动画类型,包括逐帧动画(Frame Animation)、补间动画(Tween Animation)、属性动画(Property Animation)和共享元素的转场动画(Shared Element Transition Animation)。这些动画类型各自有不同的应用场景和实现方式。
逐帧动画是最简单的一种动画类型,它通过一系列的图片资源按顺序播放,模拟动画效果。补间动画是通过定义动画的起始和结束状态,然后由系统自动计算中间状态来实现动画。属性动画则是在API 11中引入的一种更为强大的动画类型,它允许开发者对对象的任何属性进行动画处理。
在实现逐帧动画时,开发者需要准备一个或多个图片资源,然后将这些图片资源放在一个XML文件中,通过 <animation-list> 标签定义每一帧的图片及显示时长。对于补间动画和属性动画,开发者通常通过编写XML文件或直接在代码中使用 Animation 类和 ObjectAnimator 类来实现。
<!-- res/drawable/frame_animation.xml -->
<animation-list xmlns:android="http://schemas.android/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/frame1" android:duration="300" />
<item android:drawable="@drawable/frame2" android:duration="300" />
<!-- 更多帧... -->
</animation-list>
// 在代码中启动逐帧动画
ImageView imageView = findViewById(R.id.my_image_view);
imageView.setBackgroundResource(R.drawable.frame_animation);
AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground();
frameAnimation.start();
5.1.2 ImageView动画效果的实现与优化
为了使 ImageView 具有动画效果,开发者可以利用补间动画或属性动画对图片进行操作。例如,移动一个 ImageView ,可以使用 TranslateAnimation 来实现:
TranslateAnimation animation = new TranslateAnimation(0, 100, 0, 50);
animation.setDuration(1000);
imageView.startAnimation(animation);
对于属性动画,可以使用 ObjectAnimator 来改变 ImageView 的属性,如透明度和缩放:
ObjectAnimator animator = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0f, 1f);
animator.setDuration(1500);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.start();
优化 ImageView 动画时,要注意以下几个方面:
- 尽量避免在
onDraw方法中进行复杂的运算,这样会影响动画的流畅性。 - 考虑到内存和性能问题,避免加载过大的图片资源。
- 使用
android:hardwareAccelerated="true"在支持的Android版本中开启硬件加速,提高动画性能。 - 对于复杂的动画,使用
RecyclerView或ViewPager等可以实现更高效和流畅的动画效果。
5.2 响应式设计的实现
5.2.1 响应式布局设计原则
响应式设计的核心在于通过不同的设计和代码实现,使应用能够适应不同尺寸和分辨率的设备屏幕。在Android中,实现响应式设计通常需要遵循以下原则:
- 灵活的布局 : 使用灵活的布局方式,如
LinearLayout、RelativeLayout和ConstraintLayout,让布局能够根据不同屏幕尺寸进行适当的伸缩和调整。 - 媒体查询 : 利用媒体查询(Media Queries)来应用不同的样式规则,为不同屏幕尺寸的设备定制不同的样式。
- 适配性资源 : 提供适配性资源文件,如不同的图片资源文件和布局文件,以适应不同尺寸的屏幕和方向。
响应式布局的设计通常需要考虑不同屏幕尺寸和方向的变化,因此在布局文件中,可以通过不同的资源文件夹(如 layout 、 layout-large 、 layout-xlarge 、 layout-land 等)来存放针对不同设备的布局文件。
5.2.2 设备适配与屏幕兼容性处理
为了确保应用在不同设备上的一致性和可用性,开发者需要进行细致的设备适配和屏幕兼容性处理。以下是进行适配和处理的一些关键步骤:
- 使用dp和sp单位 : 在布局文件中,使用密度无关像素(dp)和可缩放像素(sp)作为尺寸和字体大小的单位,而不是使用硬编码的像素值。
- 测试不同设备 : 在不同的设备和模拟器上进行应用测试,确保布局在各种设备上表现正常。
- 设置合适的最小SDK版本 : 设置应用的最低SDK版本,以确保应用在支持的Android版本上正常运行。
- 使用百分比布局 : 在Android Studio中,可以使用百分比布局(Percent Support Library)来创建更为灵活的响应式布局。
在具体的实现中,开发者可以使用 ConstraintLayout 来创建复杂的响应式布局,利用约束来定义组件间的相对位置和大小,这样即使在不同屏幕尺寸下也能保证布局的完整性和一致性。
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android/apk/res/android"
xmlns:app="http://schemas.android/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="Example Text"/>
<!-- 更多组件和约束... -->
</androidx.constraintlayout.widget.ConstraintLayout>
通过以上这些方法和技巧,开发者可以有效地实现图片动画效果和响应式设计,从而提升应用的用户体验和界面的美观性。
6. 网络请求、异步处理与应用优化
在现代移动应用中,网络请求是获取和发送数据不可或缺的一部分。良好的异步处理机制不仅能提升用户体验,还能优化应用性能。此外,随着设计趋势和用户习惯的变化,适配不同的主题和模式,如暗黑模式,也成为提高应用吸引力的关键。本章节将详细探讨这些方面的最佳实践,以及相关的测试和调试技巧。
6.1 网络请求的实现与处理
6.1.1 网络权限的申请与配置
在Android应用中发送网络请求之前,首先需要申请网络权限。这可以通过在 AndroidManifest.xml 文件中添加相应权限来实现:
<uses-permission android:name="android.permission.INTERNET" />
对于Android 6.0 (API level 23)以上版本,还需要在运行时请求权限:
if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.INTERNET)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.INTERNET},
MY_PERMISSIONS_REQUEST_INTERNET);
}
6.1.2 异步加载网络图片的策略
对于网络图片的加载,推荐使用异步任务来避免阻塞主线程。一个常见的做法是使用 AsyncTask 或者更现代的库如 Volley 、 Retrofit 来处理网络请求。
以下是使用 AsyncTask 进行网络请求的基本示例:
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
protected Bitmap doInBackground(String... urls) {
String url = urls[0];
try {
URL urlObj = new URL(url);
HttpURLConnection connection = (HttpURLConnection) urlObj.openConnection();
connection.setRequestMethod("GET");
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(input);
return bitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
protected void onPostExecute(Bitmap result) {
imageView.setImageBitmap(result);
}
}
执行异步任务以加载图片:
new DownloadImageTask().execute("http://example/image.png");
6.2 主题与暗黑模式的适配
6.2.1 主题切换机制与实现
主题的切换可以通过在应用的主题设置中修改为不同的样式资源来实现。在 styles.xml 中定义亮色模式和暗色模式的样式:
<style name="LightTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Define your light theme colors here -->
</style>
<style name="DarkTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Define your dark theme colors here -->
</style>
在代码中切换主题:
SharedPreferences sharedPref = getSharedPreferences("AppSettings", MODE_PRIVATE);
boolean isDarkTheme = sharedPref.getBoolean("darkTheme", false);
Resources resources = getResources();
if (isDarkTheme) {
setTheme(R.style.DarkTheme);
} else {
setTheme(R.style.LightTheme);
}
6.2.2 暗黑模式的适配方法与技巧
为了适配暗黑模式,除了定义主题样式,还需要确保应用的资源文件也遵循暗黑模式的设计指南。这包括修改图片资源、背景颜色、文字颜色等,以保证在不同主题下都具备良好的可读性。
在 res/values-night/ 目录下定义暗黑模式相关的资源,如颜色和样式。
6.3 应用测试与调试
6.3.1 测试工具与方法
应用测试可以使用多种工具和方法,例如单元测试、UI测试、性能测试等。单元测试可以使用 JUnit 配合 Mockito 进行;UI测试则可以利用 Espresso 框架;性能测试通常通过 Android Profiler 工具来分析。
进行单元测试的简单示例:
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, Calculator.add(2, 2));
}
6.3.2 常见问题的调试与优化建议
调试时,重点检查网络请求的正确性、异步任务的执行效率、主题切换时资源的正确加载,以及性能测试中的瓶颈。针对这些问题,可以采取以下优化措施:
- 使用HTTP缓存减少网络请求。
- 优化网络图片的加载策略,例如使用懒加载。
- 确保暗黑模式与亮色模式的资源文件被正确引用,避免不必要的资源加载。
- 使用性能分析工具定位并优化性能瓶颈,例如内存泄漏和慢查询。
通过实施这些步骤,可以显著提升应用的性能和用户体验。
本文还有配套的精品资源,点击获取
简介:安卓开发中,优化用户界面体验包括为天气页面添加背景图片。本项目“酷欧天气(4)”将引导你通过布局文件和代码实现此功能,涉及资源管理、ImageView设置、动态图片加载、响应式设计、图片动画、内存优化、网络请求和动态更新、主题适配、测试与调试等方面。掌握这些技术要点能够显著提升你的安卓应用开发能力。
本文还有配套的精品资源,点击获取
版权声明:本文标题:安卓应用实战:为酷欧天气页面添加背景图片 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1765979568a3428958.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论