从文件夹中获得主题资源,然后在程序中做相关调整,下面看一个简单的例子效果:
主题文件放到主题文件夹下,效果如下:
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 进行app界面应用程序图标的背景,workspace上应用程序,文件夹,等图标的背景的随主题切换
1.可以设置为文件浏览器、选择文件、保存文件、选择文件夹4种类型; 2.可以设置默认文件名、初始路径、多项选择; 3.可以对文件进行剪切、复制、粘贴、重命名等功能; 只在自己手机和模拟器上测试过,测试环境: 1....
它不仅涵盖了Android平台从基础概念到高级应用的所有主题,而且深入浅出地介绍了几种常见的Android项目,具有很强的参考价值。特别是在本书的第10-11章重点介绍了Android SDK l.5引入的最为重要的三个特性,即桌面...
第1部分AndroidUI基础 第1章 入门 1.1 HeUoWorld 1.2 Android应用程序的基本结构 1.2.1文件夹结构 1. 2.2.AndroidManifest 1.2.3 资源 1.3 AndroidUI基础 1.3.1 主屏幕和通知栏1.3.2 XM[布局 1.3.3 ACTIVI'[Y类 ...
首页Tab可配置,最多支持五个,包括歌曲、艺术家、专辑、文件夹、播放列表 专辑、艺术家封面自动补全 支持显示本地和在线歌词(网易),可设置歌词搜索的优先级;本地歌词可以自由选择,或者忽略歌词 支持耳机线控操作,...
我们做项目的时候,并不是所有文 件都是要提交的,比如构建的build 文件夹,本地配置文件,每个Module 生成的iml 文件,但是我们每次add,commit 都会不小心把它们添加上去,而gitignore 就是解决这种痛点的,如果你...
第1章 Android计算平台简介 1.1 面向新PC的全新平台 1.2 Android的历史 1.3 Dalvik VM剖析 1.4 理解Android软件栈 1.5 使用Android SDK开发最终用户应用程序 1.5.1 Android模拟器 1.5.2 ...
Github 上已经有各种高质量的「集锦」,它们的工作是按某种主题分类整理高质量的开源项目,给出链接、总结优缺点。这样的集锦是有意义的。 但这个项目并不是「开源项目集锦」,把这些开源项目放在一个文件夹里,「...
10.1.3 绑定本地Service并与之 通信 377 10.1.4 Service的生命周期 381 10.2 跨进程调用Service (AIDL服务) 382 10.2.1 AIDL服务简介 382 10.2.2 创建AIDL文件 383 10.2.3 将接口暴露给客户端 383...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
目 录 1项目简介 2 2开发环境 2 2.1Android平台结构介绍 2 2.2 MVC框架 3 3功能介绍 3 3.1登录 3 3.2注册 3 3.3添加 4 3.4查询 5 3.5主页面 6 4数据库结构 7 4.1数据表设计 7 5项目结构 7 5.1 src文件夹 7 52 gen...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
在Android API 19以上可以使用****.TranslucentDecor***有关的主题,自带相应半透明效果,Theme.Holo.NoActionBar.TranslucentDecor和Theme.Holo.Light.NoActionBar.TranslucentDecor两种主题为新增加的,所以要新建...
3.21 Android变脸——主题(Theme)实现 第4章 史上超豪华的手机控件 4.1 EditText与TextView共舞——setOnKeyListener事件 4.2 设计具有背景图的按钮——ImageButton的焦点及事件处理 4.3 给耶诞老人的信息——Toast...
课本第2章讲解了Android UI开发,其中包括了相对布局、线性布局、样式和主题、国际化等知识点。在实 际开发中,这些知识点的使用频率比较高,这里将通过一个综合型案例——手机信 息页来演示这些知识点的综合应用。...
我们对android有了个大致的了解,知道如何搭建android的环境及简单地写一个HelloWorld程序,而且知道一个android项目包括哪些文件夹和文件及相应的作用。本篇将站在顶级的高度——架构,来看android。我开篇就说了,...
本文实例讲述了Android编程入门之HelloWorld项目目录结构。分享给大家供大家参考,具体如下: 我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目,本篇将通过HelloWorld项目来介绍Android项目的目录...
6.8、样式(Style)和主题(Theme)资源: 6.9、属性(Attribute)资源: 6.10、使用原始资源: 6.11、国际化和资源自适应: 第7章、图形与图像处理 7.1、使用简单图片:Drawable; Bitmap、BitmapFactory; 7.2、绘图...
1工程简介2 2开发环境2 2.1Android平台构造介绍2 2.2 MVC框架3 3功能介绍3 3.1登录3 3.2注册3 3.3添加3 3.4查询3 3.5主页面3 4数据库构造3 4.1数据...文件夹3 5.6 AndroidManifest.xml3 6工程总结3 Android工程开发报告...