Android基础篇(三)

Activity中的按键监听

可以在Activity中重写onKeyDown或者onKeyUp来监听按键,以监听返回键弹起为例:

public boolean onKeyUp(int KeyCode,KeyEvent event){
    //监听返回键
    if(keyCode == KeyEvent.KEYCODE_BACK){
        log.e("m_tag","=====onKetUp====");
        //结束房钱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
    ndroid: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"
    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.getPregress();
                    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);
        }
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_42097095/article/details/80601781