Activity中的按键监听
可以在Activity中重写onKeyDown或者onKeyUp来监听按键,以监听返回键弹起为例
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
//监听返回键
if(keyCode == KeyEvent.KEYCODE_BACK){
Log.e("m_tag","====onKeyUp====");
//结束当前Activity的方法
finish();
return true;
}
return super.onKeyUp(keyCode, event);
}
滚动视图
辅助其他视图完成滚动,,将可见区域之外的内容滚动到区域之内,只能有一个孩子
ScrollView 垂直方向
HorizontalScrollView 水平方向
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context="com.xykj.day6.MainActivity" >
...其他视图...
</LinearLayout>
</ScrollView>
进度条
进度条ProgressBar,默认是转圈,如果要改为水平的需要添加样式
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ProgressBar
android:id="@+id/progress_bar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="1000"
android:progress="500"
android:secondaryProgress="750" />
style="@android:style/Widget.ProgressBar.Horizontal"表示设置进度条为水平长条
android:max="1000" 最大值,默认100
android:progress="500" 实际进度,第一进度
android:secondaryProgress="750" 虚进度,第二进度
java中设置进度
progress = (ProgressBar) findViewById(R.id.progress_bar);
//设置最大值
progress.setMax(100);
//设置实进度
progress.setProgress(10);
//设置第二进度
progress.setSecondaryProgress(30);
拖动条,SeekBar,继承自ProgressBar,有一个拖块可以让用户来改变进度值
<SeekBar
android:id="@+id/seek"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
java:
mSeek = (SeekBar) findViewById(R.id.seek);
//监听进度变化
mSeek.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
//停止拖动
@Override
public void onStopTrackingTouch(SeekBar bar) {
Log.e("m_tag","onStopTrackingTouch");
}
//开始拖动
@Override
public void onStartTrackingTouch(SeekBar bar) {
Log.e("m_tag","onStartTrackingTouch");
}
//进度变化的时候触发
//第三个参数表示是否是用户拖动拖块导致进度变化的,是则为true
@Override
public void onProgressChanged(SeekBar bar, int progress, boolean isFromUser) {
Log.e("m_tag","progress:"+progress+" isFromUser:"+isFromUser);
}
});
评分组件,可以使用星星来表示分值的组件,半颗星默认0.5分一颗1分
<RatingBar
android:id="@+id/rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:rating="1.5"
android:numStars="5"
/>
如果加上android:isIndicator="true"表示为指示器,只可以看不可以拖(只能程序改变分值,用户不能改变分值)
java中监听
mRating.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar bar, float rating, boolean isFromUser) {
Log.e("m_tag","rating:"+rating);
}
});
自定义进度条效果
在drawable文件中新建xml文件,根节点为layer-list,然后分别设置背景、第二进度、第一进度的图片资源
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 背景层 -->
<item
android:id="@android:id/background"
android:drawable="@drawable/bg"/>
<!-- 第二进度 -->
<item
android:id="@android:id/secondaryProgress"
android:drawable="@drawable/s_pro"/>
<!-- 第一进度 -->
<item
android:id="@android:id/progress"
android:drawable="@drawable/pro"/>
</layer-list>
使用,可以在进度条上设置android:progressDrawable属性
<ProgressBar
android:id="@+id/progress_bar"
style="@android:style/Widget.ProgressBar.Horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="1000"
android:progress="500"
android:progressDrawable="@drawable/progress_drawable" />
<SeekBar
android:id="@+id/seek"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progressDrawable="@drawable/progress_drawable" />
关于拖动条的拖块,可以定义一个selector文件,处理未按下以及按下的图片,然后使用android:thumb属性添加即可
trhumb_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_nomal" android:state_pressed="false"/>
<item android:drawable="@drawable/btn_pressn" android:state_pressed="true"/>
</selector>
设置拖块
<SeekBar
android:id="@+id/seek"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progressDrawable="@drawable/progress_drawable"
android:thumb="@drawable/thumb_drawable"/>
对于评分组件,可以使用第二进度来表示半颗星
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@android:id/background"
android:drawable="@drawable/star_bg"/>
<!-- 评分控件半颗星用第二进度表示 -->
<item
android:id="@android:id/secondaryProgress"
android:drawable="@drawable/star_harf"/>
<item
android:id="@android:id/progress"
android:drawable="@drawable/star"/>
</layer-list>
使用
<RatingBar
android:id="@+id/rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:rating="1.5"
android:numStars="5"
android:progressDrawable="@drawable/rating_drawale" />
子线程
Android中只允许在主线程中更新UI,子线程中如果要更新UI,则需要将信息发布给主线程(跟主线程通讯),让主线程来更新
1、定义线程,在线程中处理耗时业务,并且需要更新UI时发消息给主线程
private Thread t;
private void autoUpdate() {
//如果已经有线程在更新进度,则不再更新
if (t != null && t.isAlive()) {
return;
}
t = new Thread() {
@Override
public void run() {
try {
while (progress.getProgress() < progress.getMax()) {
Thread.sleep(500);
// 获取当前进度
int current = progress.getProgress();
current += 5;
// 将新的进度值显示出来
Message msg = new Message();
msg.what = 1; // 消息编号
msg.obj = current; // 消息携带的内容(Object)
mHandler.sendMessage(msg);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
// 启动线程
t.start();
}
注意:消息发送时可以使用以下方法简化消息创建过程
mHandler.obtainMessage(1, current).sendToTarget();
2、主线程中可以定义Handler对象来接收消息,并且更新UI
// 接收消息的对象
private Handler mHandler = new Handler() {
// 接收其他地方发来的消息
public void handleMessage(android.os.Message msg) {
// 主线程中
if(msg.what==1){
int pro = (Integer)msg.obj;
progress.setProgress(pro);
}
}
};