类似这样
特别是有图表的页面
一.屏幕在休眠唤醒后闪屏?
答:添加当屏幕休眠时置低reset脚,在resume的时候再重新拉高reset脚.
二.在kernel内添加自己的Logo?
答:
1. 制作当前屏幕像素的图片(模拟器默认为320*480)使用PS制作一张320*480的图片,保存时选“保存为 Web 所用格式”,然后在弹开的窗口上,“预设”项选择“PNG-24”,保存为android_logo.png
注:好像只支持png-24,其他格式生成的rle文件显示不正常,有兴趣大家可以再验证一下。
2. 将图片转换为raw格式
使用linux下的ImageMagick自带的convert命令,进行raw格式转换,命令为:
convert -depth 8 android_logo.png rgb:android_logo.raw
注:ubuntu 10.04 默认已经安装ImgageMagick工具,如果当前系统没有安装,可以执行下面的命令安装:
sudo apt-get install imagemagick
3. 将raw格式转化为rle文件
需要用到android编译后的rgb2565工具,在android/out/host/linux-x86/bin目录下(android为当前源码所在目录),转换命令如下:
rgb2565 -rle < android_logo.raw > initlogo.rle
到目前为止,启动需要显示的图像已经做好了,就是initlogo.rle,注意文件名必须是这个,如果想改文件名,需要修改android/system/core/init/init.h中的宏:
#define INIT_IMAGE_FILE "/initlogo.rle" 4.在板子的根目录下加initlogo.rle文件.
a. put the file initlogo.rle in device /qcom/common/
b.修改device /qcom/common/common.mk
添加 PRODUCT_COPY_FILES := \
....
$(LOCAL_PATH)/initlogo.rle:root/initlogo.rle \
最后再将整个Android 系统编译,检查生成的out/target/product/msm7627a_sku3/root/就可以发现initlogo.rle在其目录下.
三.在TP下加载虚拟按键?
在probe设置按键类型
__set_bit(KEY_MENU, ts->input_dev->keybit);
__set_bit(KEY_HOME, ts->input_dev->keybit);
__set_bit(KEY_BACK, ts->input_dev->keybit);
__set_bit(KEY_SEARCH, ts->input_dev->keybit);
并且设置按键区域 static struct osd_offset OSD_mapping[] = {
{1, 165, KEY_SEARCH},
{285, 410, KEY_MENU},
{480, 590, KEY_HOME},
{650, 790, KEY_BACK},
};
中断里面处理 上报函数 input_report_key(idev, OSD_mapping[i].key_event, 1);
其它的程序流程基本上跟TP的一样.
在Android中是不允许在子线程中跟新UI的,解决这个问题的主要方法有两种:
1、Handler
2、AsyncTask
现在就来讲解AsyncTask跟新进度条的例子
AsyncTask的构造函数中有三个参数
第一个参数:表示传递到doInBackground中的参数
第二个参数:表示传递到onProgressUpdate中的参数
第三个参数:表示doInBackground的返回值
对AsyncTask中几个比较常用的函数进行解释:
doInBackground :表示在后台运行的代码,主要用于执行比较耗时的任务,比如从网络下载数据
onPreExecute:表示在execute方法之前执行
onPostExecute:表示在execute方法后面执行
onProgressUpdate:主要用来跟新UI的
publishProgress:一般在doInBackground调用,从而调用onProgressUpdate
下面将我跟新ProgressBar的代码贴上:
public class MyTask extends AsyncTask<ProgressBar, Integer,Integer>
{
//用于保存UI上面的进度条
private ProgressBar bar;
@Override
protected Integer doInBackground(ProgressBar... params)
{
// TODO Auto-generated method stub
System.out.println("doinbackground=====>"+Thread.currentThread().getName());
bar=params[0];
int i=0;
for(;i<=bar.getMax();i++)
{
bar.setProgress(i);
try
{
//通过调用此方法,从而调用onProgressUpdate
this.publishProgress(i);
Thread.sleep(1000);
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return i;
}
@Override
protected void onCancelled()
{
// TODO Auto-generated method stub
super.onCancelled();
}
@Override
protected void onPostExecute(Integer result)
{
// TODO Auto-generated method stub
super.onPostExecute(result);
System.out.println("postExecute=====>"+Thread.currentThread().getName());
}
@Override
protected void onPreExecute()
{
// TODO Auto-generated method stub
super.onPreExecute();
System.out.println("preExecute=====>"+Thread.currentThread().getName());
}
@Override
protected void onProgressUpdate(Integer... values)
{
// TODO Auto-generated method stub
System.out.println("onprogressUpdate=====>"+Thread.currentThread().getName());
super.onProgressUpdate(values);
bar.setProgress(values[0]);
}
}