Android UI学习笔记.docx
- 文档编号:18574832
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:20
- 大小:102.78KB
Android UI学习笔记.docx
《Android UI学习笔记.docx》由会员分享,可在线阅读,更多相关《Android UI学习笔记.docx(20页珍藏版)》请在冰点文库上搜索。
AndroidUI学习笔记
Android中的像素:
(sp作为文字大小的单位,dp(dip)作为其他元素的单位)
dip:
deviceindependentpixels(设备独立像素).不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。
px:
pixels(像素).不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt:
point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp:
scaledpixels(放大像素).主要用于字体显示bestfortextsize。
由此,根据google的建议,TextView的字号最好使用sp做单位,而且查看
TextView的源码可知Android默认使用sp作为字号单位。
在Android中,1pt大概等于2.22sp
以上供参考,如果UI能够以sp为单位提供设计是最好的,如果设计中没有sp
的概念,则开发人员也可以通过适当的换算取近似值。
过去,程序员通常以像素为单位设计计算机用户界面。
例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素等。
这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。
在有些情况下,用户界面可能会小到难以看清内容。
与分辨率无关的度量单位可以解决这一问题。
Android支持下列所有单位。
px(像素):
屏幕上的点。
in(英寸):
长度单位。
mm(毫米):
长度单位。
pt(磅):
1/72英寸。
dp(与密度无关的像素):
一种基于屏幕密度的抽象单位。
在每英寸160点的显示器上,1dp=1px。
dip:
与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):
与dp类似,但是可以根据用户的字体大小首选项进行缩放。
为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。
当然,也可以考虑使用矢量图形,而不是用位图
AndroidLauncher:
Handler:
/***
*Handler的定义:
*主要接受子线程发送的数据,并用此数据配合主线程更新UI。
当应用程序启动时,
*Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说,
*你要是点击一个Button,Android会分发事件到Button上,来响应你的操作。
*如果此时需要一个耗时的操作,例如:
联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,
*如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭"。
*这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,
*也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。
这个时候,Handler就出现了,来解决这个复杂的问题,
*由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,
*这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。
*Handler一些特点:
*Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
*它有两个作用:
(1):
安排消息或Runnable在某个主线程中某个地方执行,
(2)安排一个动作在不同的线程中执行
*Handler中分发消息的一些方法
*post(Runnable)
*postAtTime(Runnable,long)
*postDelayed(Runnable,long)
*sendEmptyMessage(int)
*sendMessage(Message)
*sendMessageAtTime(Message,long)
*sendMessageDelayed(Message,long)
*以上post类方法允许你排列一个Runnable对象到主线程队列中,当需要在不同于主UI线程中执行则需要配合HandlerThread进行使用:
*HandlerThreadhandlerThread=newHandlerThread("myHandlerThread");
*handlerThread.start();
*handler=newHandler(handlerThread.getLooper());*sendMessage类方法,允许你安排一个带数据的Message对象到队列中,等待更新.
*@authorxiaoshuang
*
*/
publicclassHandlerActivityextendsActivity{
privateTextViewtextView;
privateMyHandlermyHandler;
privateButtonbutton;
privateProgressBarprogressBar;
privateMyThreadm=newMyThread();
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView=(TextView)findViewById(R.id.text);
button=(Button)findViewById(R.id.startButton);
progressBar=(ProgressBar)findViewById(R.id.bar);
progressBar.setMax(100);
button.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewarg0){
myHandler=newMyHandler();
newThread(m).start();
System.out.println("onCreate--TheThreadis:
"+Thread.currentThread().getId());
}
});
}
//在对UI进行更新时,执行时所在的线程为主UI线程
classMyHandlerextendsHandler{//继承Handler类时,必须重写handleMessage方法
publicMyHandler(){
}
publicMyHandler(Looperl){
super(l);
}
@Override
publicvoidhandleMessage(Messagemsg){//执行接收到的通知,此时执行的顺序是按照队列进行,即先进先出
System.out.println("Handler--TheThreadIdis:
"+Thread.currentThread().getId());
super.handleMessage(msg);
Bundleb=msg.getData();
StringtextStr0=textView.getText().toString();
StringtextStr1=b.getString("textStr");
HandlerActivity.this.textView.setText(textStr0+""+textStr1);//更改TextView中的值
intbarValue=b.getInt("barValue");HandlerActivity.this.progressBar.setProgress(barValue);//更改进度条当中的值
}
}
//该线程将会在单独的线程中运行
classMyThreadimplementsRunnable{
inti=1;
@Override
publicvoidrun(){
while(i<11){
System.out.println("Thread--TheThreadIdis:
"+Thread.currentThread().getId());
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
Messagemsg=newMessage();
Bundleb=newBundle();
b.putString("textStr","线程运行"+i+"次");
b.putInt("barValue",i*10);
i++;
msg.setData(b);
HandlerActivity.this.myHandler.sendMessage(msg);//通过sendMessage向Handler发送更新UI的消息
}
}
}
}
/***
*Handler的定义:
*主要接受子线程发送的数据,并用此数据配合主线程更新UI。
当应用程序启动时,
*Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发,比如说,
*你要是点击一个Button,Android会分发事件到Button上,来响应你的操作。
*如果此时需要一个耗时的操作,例如:
联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,
*如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭"。
*这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,
*也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。
这个时候,Handler就出现了,来解决这个复杂的问题,
*由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,
*这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。
*Handler一些特点:
*Handler可以分发Message对象和Runnable对象到主线程中,每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),
*它有两个作用:
(1):
安排消息或Runnable在某个主线程中某个地方执行,
(2)安排一个动作在不同的线程中执行
*Handler中分发消息的一些方法
*post(Runnable)
*postAtTime(Runnable,long)
*postDelayed(Runnable,long)
*sendEmptyMessage(int)
*sendMessage(Message)
*sendMessageAtTime(Message,long)
*sendMessageDelayed(Message,long)
*以上post类方法允许你排列一个Runnable对象到主线程队列中,当需要在不同于主UI线程中执行则需要配合HandlerThread进行使用:
*HandlerThreadhandlerThread=newHandlerThread("myHandlerThread");
*handlerThread.start();
*handler=newHandler(handlerThread.getLooper());
*sendMessage类方法,允许你安排一个带数据的Message对象到队列中,等待更新.
*@authorxiaoshuang
*
*/
publicclassHandlerActivityextendsActivity{
privateTextViewtextView;
privateMyHandlermyHandler;
privateButtonbutton;
privateProgressBarprogressBar;
privateMyThreadm=newMyThread();
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView=(TextView)findViewById(R.id.text);
button=(Button)findViewById(R.id.startButton);
progressBar=(ProgressBar)findViewById(R.id.bar);
progressBar.setMax(100);
button.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewarg0){
myHandler=newMyHandler();
newThread(m).start();
System.out.println("onCreate--TheThreadis:
"+Thread.currentThread().getId());
}
});
}
//在对UI进行更新时,执行时所在的线程为主UI线程
classMyHandlerextendsHandler{//继承Handler类时,必须重写handleMessage方法
publicMyHandler(){
}
publicMyHandler(Looperl){
super(l);
}
@Override
publicvoidhandleMessage(Messagemsg){//执行接收到的通知,此时执行的顺序是按照队列进行,即先进先出
System.out.println("Handler--TheThreadIdis:
"+Thread.currentThread().getId());
super.handleMessage(msg);
Bundleb=msg.getData();
StringtextStr0=textView.getText().toString();
StringtextStr1=b.getString("textStr");
HandlerActivity.this.textView.setText(textStr0+""+textStr1);//更改TextView中的值
intbarValue=b.getInt("barValue");
HandlerActivity.this.progressBar.setProgress(barValue);//更改进度条当中的值
}
}
//该线程将会在单独的线程中运行
classMyThreadimplementsRunnable{
inti=1;
@Override
publicvoidrun(){
while(i<11){
System.out.println("Thread--TheThreadIdis:
"+Thread.currentThread().getId());
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
Messagemsg=newMessage();
Bundleb=newBundle();
b.putString("textStr","线程运行"+i+"次");
b.putInt("barValue",i*10);
i++;
msg.setData(b);
HandlerActivity.this.myHandler.sendMessage(msg);//通过sendMessage向Handler发送更新UI的消息
}
}
}
}
AndroidUI系列之:
滑动式抽屉详解
AndroidUI控件之SlidingDrawer(滑动式抽屉)详解与实例
2011-01-0900:
19:
15| 分类:
默认分类| 标签:
|字号大中小 订阅
一、简介
SlidingDrawer隐藏屏外的内容,并允许用户通过handle以显示隐藏内容。
它可以垂直或水平滑动,它有俩个View组成,其一是可以拖动的handle,其二是隐藏内容的View.它里面的控件必须设置布局,在布局文件中必须指定handle和content.
SlidingDrawer效果想必大家也见到过,它就是1.5模拟器上进入应用程序列表的效果。
下面是截图
Android控件之SlidingDrawer(滑动式抽屉)详解与实例
Android控件之SlidingDrawer(滑动式抽屉)详解与实例
例如下面
layout_width="fill_parent" android: layout_height="fill_parent"android: handle="@+id/handle" android: content="@+id/content"android: orientation="vertical" android: id="@+id/slidingdrawer"> id="@id/handle"android: layout_width="50dip" android: layout_height="44dip"android: src="@drawable/up"/> id="@id/content" android: layout_width="fill_parent"android: layout_height="fill_parent" android: background="#ffffff"> text="这是一个滑动式抽屉的示例" android: id="@+id/tv" android: textSize="18px" android: textColor="#000000" android: gravity="center_vertical|center_horizontal" android: layout_width="match_parent" android: textStyle="bold" android: layout_height="match_parent"> 二、重要属性 android: allowSingleTap: 指示是否可以通过handle打开或关闭 android: animateOnClick: 指示是否当使用者按下手柄打开/关闭时是否该有一个动画。 android: content: 隐藏的内容 android: handle: handle(手柄) 三、重要方法 animateClose(): 关闭时实现动画。 close(): 即时关闭 getContent(): 获取内容 isMoving(): 指示SlidingDrawer是否在移动。 isOpened(): 指示SlidingDrawer是否已全部打开 lock(): 屏蔽触摸事件。 setOnDrawerCloseListener(SlidingDrawer.OnDrawerCloseListeneronDrawerCloseListener): SlidingDrawer关闭时调用 unlock(): 解除屏蔽触摸事件。 toggle(): 切换打开和关闭的抽屉SlidingDrawer。 四、完整实例 1.布局文件slidingdrawer.xml xmlversion="1.0"encoding="utf-8"? > android=" android: orientation="vertical" android: layout_width="fill_parent" android: layout_height="fill_parent" > layout_width="fill_parent"android: layout_height="fill_parent"android: handle="@+id/handle"android: content="@+id/content"android: orientation="vertical"android: id="@+id/slidingdrawer">
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android UI学习笔记 UI 学习 笔记
![提示](https://static.bingdoc.com/images/bang_tan.gif)