从文件夹中获得主题资源,然后在程序中做相关调整,下面看一个简单的例子效果:
主题文件放到主题文件夹下,效果如下:
skin存在SDCARD路径下,skin/0和skin/1下是两个主题文件夹,里面包含对应的主题文件。
获得图片资源:使用方法Bitmap android.graphics.BitmapFactory.decodeFile(String pathName)可以获得对应文件的Bitmap对象。
更新UI:使用AsyncTask来完成后获得台图片操作和UI的更新。
主要操作代码如下:
import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Rect; import android.graphics.drawable.NinePatchDrawable; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; public class SkinArchiveActivity extends Activity implements OnClickListener { private byte[] chunk = {1, 2, 2, 9, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 5, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 12, 0, 0, 0, 6, 0, 0, 0, 53, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0}; private ImageView imageLeft; private ImageView imageRight; private Button themeDefault; private Button themeOrange; private Button themePink; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); imageLeft = (ImageView) findViewById(R.id.image_left); imageRight = (ImageView) findViewById(R.id.image_right); themeDefault = (Button) findViewById(R.id.theme_default); themeDefault.setOnClickListener(this); themeOrange = (Button) findViewById(R.id.theme_orange); themeOrange.setOnClickListener(this); themePink = (Button) findViewById(R.id.theme_pink); themePink.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.theme_default: imageLeft.setImageResource(android.R.drawable.presence_invisible); imageRight.setImageResource(android.R.drawable.presence_online); themeDefault.setBackgroundResource(android.R.drawable.btn_default); themeOrange.setBackgroundResource(android.R.drawable.btn_default); themePink.setBackgroundResource(android.R.drawable.btn_default); break; case R.id.theme_orange: new ImageLoader(imageLeft, false).execute("/mnt/sdcard/skin/1/image_left.png"); new ImageLoader(imageRight, false).execute("/mnt/sdcard/skin/1/image_right.png"); new ImageLoader(themeDefault, false).execute("/mnt/sdcard/skin/1/button_background.png"); new ImageLoader(themeOrange, false).execute("/mnt/sdcard/skin/1/button_background.png"); new ImageLoader(themePink, false).execute("/mnt/sdcard/skin/1/button_background.png"); break; case R.id.theme_pink: new ImageLoader(imageLeft, false).execute("/mnt/sdcard/skin/0/image_left.png"); new ImageLoader(imageRight, false).execute("/mnt/sdcard/skin/0/image_right.png"); new ImageLoader(themeDefault, false).execute("/mnt/sdcard/skin/0/button_background.png"); new ImageLoader(themeOrange, false).execute("/mnt/sdcard/skin/0/button_background.png"); new ImageLoader(themePink, false).execute("/mnt/sdcard/skin/0/button_background.png"); break; default: break; } } private class ImageLoader extends AsyncTask<String, Void, Bitmap> { private boolean isDefault = true; private View view; public ImageLoader(View view, boolean isDefault) { this.view = view; this.isDefault = isDefault; } @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onPostExecute(Bitmap result) { super.onPostExecute(result); if (result == null) { return; } if (view instanceof ImageView) { ((ImageView)view).setImageBitmap(result); return; } view.setBackgroundDrawable(new NinePatchDrawable(result, chunk, new Rect(), null)); } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); } @Override protected Bitmap doInBackground(String... params) { if (params == null || params.length == 0 || isDefault) { return null; } return BitmapFactory.decodeFile(params[0]); } } }
说明:
- byte[] chunk:用来构造NinePatchDrawable的相关缩放部分的信息,详情参考:http://developer.android.com/reference/android/graphics/NinePatch.html http://developer.android.com/reference/android/graphics/drawable/NinePatchDrawable.html;
- android.graphics.drawable.NinePatchDrawable.NinePatchDrawable(Bitmap bitmap, byte[] chunk, Rect padding, String
srcName):构造可以缩放的NinePatchDrawable对象; - class ImageLoader:继承自AsyncTask(关于AsyncTask可参考开发者网站,或者http://wangleyiang.iteye.com/admin/blogs/1775266),用于完成图片的获取和UI更新操作;
- void onPostExecute(Bitmap result):UI更新部分操作;
- Bitmap doInBackground(String... params):图片获取部分操作;
有待完善:
- 主题文件夹的获取通常是通过网络进行下载,而且应用中可以包含若干个主题文件夹。示例中仅仅是模拟两个主题文件夹的情况来说明问题。
- 主题文件夹被下载时,通常会被压缩成压缩文件,然后进行下载,下载后再解压,然后做其它相关操作。关于压缩和解压的操作,至于是否添加压缩密码,这个看不同情况而定。
- 主题文件夹保存在SDCARD下通常不是一个理想的做法,原因是当用户卸载SDCARD时,那么所需的主题文件资源也就获得不了了。建议解压到应用程序数据目录下。
- 本示例比较简单,所以全部操作都在Activity中完成。最好创建一个主题管理类,然后集中处理主题相关的操作。
- 本示例只讲解了图片资源的一个可行性操作,当然也可以有其它操作方式。关于图片以外的其它资源,需要添加相关代码处理和测试。
- 关于主题状态的保存和恢复在实例中没有说明,根据不同情况,选择合适操作即可。
- chunk的获取方式:可以先熟悉.9.png的相关知识,然后根据chunk的规则自己定义,可以从一个.9.png的图片的Bitmap对象中获得(getNinePatchChunk())chunk,当然也可以采用可以获得chunk的其它方法。
多说一句:源码见附件!:)
相关推荐
在Android平台上,从指定文件夹显示图片涉及到一系列的步骤和技术,包括文件系统操作、图片加载库的使用以及UI设计。以下是对这个主题的详细讲解: 首先,我们需要理解Android的文件系统结构。Android设备通常有两...
你可以将打包好的主题文件分享给其他人,他们只需要将文件放到自己的Android Studio配置目录下的themes文件夹内,重启Android Studio即可看到并选择新的主题。 5. 自动切换: 如果你希望根据日间和夜间自动切换...
1. **Android主题的基本概念** - 主题是Android系统中定义UI样式的一种方式,它包含了多个样式属性,如背景颜色、字体大小、按钮样式等。 - 主题可以在应用程序级别或者活动(Activity)级别进行设置,全局主题会...
5. ContentProvider:Android的四大组件之一,用于跨应用共享数据,如联系人信息。通过ContentProvider,其他应用可以查询和修改这个文件或数据库中的数据。 6. Android权限:访问文件系统和联系人数据需要获取相应...
Android主题是在应用程序或活动中定义的一系列样式属性,这些属性可以影响到控件的外观,如按钮、文本框等。主题通常定义在res/values/styles.xml文件中,包括颜色、字体、尺寸、形状等各种视觉元素。 二、创建...
本文将深入探讨Android主题开发的核心概念、实现方法以及相关技术。 一、Android主题与样式 Android中的主题(Theme)是全局的UI风格,它定义了应用程序的整体外观,包括颜色、字体、布局等元素。而样式(Style)...
“options”文件夹通常包含Android Studio的各种配置选项,如代码样式、 inspections(检查)和编辑器设置等。这些选项可能会影响到主题的显示效果,确保配色方案的完整应用。 “colors”文件可能包含了具体的颜色...
在Android开发中,构建一个能够展示多层文件夹结构的界面是常见的需求,尤其是在处理文件管理系统时。"android树状结构图"就是这样一个解决方案,它借鉴了ExpandableListView组件的概念,允许用户递归地展开和浏览...
在Android系统中,移动文件是常见的操作,特别是当你...以上就是关于从Android外置TF卡文件夹复制文件到手机内存文件夹的核心知识点。通过理解这些概念和实践,你可以编写出能够有效处理文件转移的Android应用程序。
在Android平台上,将网页内容通过HTTP协议下载到指定文件夹是一项常见的任务,尤其在离线浏览、数据缓存或者后台更新资源的场景中。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,它允许客户端(如...
2. 主题文件夹:解压主题包,拖拽后缀名为 mtz 格式的主题文件,置于主题工具上,等待一段时间,便会有一个与 mtz 文件名称相同的文件夹。 3. 主题信息填写:打开主题以后,可以看到主题名称、制作者、设计者,以及...
22. `360launcher`:360手机桌面的主题文件夹,删除可能导致主题显示异常。 23. `365riliDownload`:365日历的下载文件夹,可能包含日历插件等。 24. `8684`,`8684train`:8684公交和火车查询应用的相关文件。 ...
"简单方便的文件夹管理"这个主题旨在探讨如何高效地组织和管理计算机中的文件夹,以提升工作效率和数据安全性。 首先,了解基本的文件夹操作是至关重要的。这包括创建、重命名、移动和删除文件夹。在Windows系统中...
这时,需要为每个主题创建相应的资源文件夹,如 drawable-night、layout-night 等,并在代码中根据当前主题加载对应的资源。 6. 注意事项: - 考虑到性能,尽量减少动态换肤时的资源加载和重建工作。 - 如果有...
在MultipleTheme框架中,可能包含了不同主题的资源文件夹,每个文件夹代表一种皮肤。用户选择主题后,框架会动态替换当前应用使用的资源引用,达到换肤的效果。 夜间模式则是调整应用程序的亮度和颜色,使其更适合...
这个压缩包“Android7.0 自定义文件管理器 获取文件夹路径.rar”包含了关于如何在新版本的Android系统上开发自定义文件管理器并获取文件夹路径的相关信息。以下是对这个主题的详细阐述: 1. **Android 7.0的存储...
在Android开发中,样式的定义和应用是实现界面美观和一致性的关键技术之一。样式(Style)和主题(Theme)在Android中扮演着重要的角色,它们可以帮助开发者通过定义和重用界面元素的属性来减少代码重复,提高开发...
2. **下载主题zip文件**:寻找并下载你喜欢的Android主题zip文件。这些文件可以从各种主题论坛、应用市场或开发者网站获取。确保下载的主题适用于你的设备型号和Android版本。 3. **备份原有文件**:在替换主题之前...
- 解压mtz格式的主题文件,生成对应的主题文件夹。 - 填写主题的基本信息,如主题名称、制作者、设计者等,保存后生成description.xml文件。 - 打包生成mtz格式的主题文件,可以选择直接导入手机并应用,前提是...