1      基本UI(二)
1.1    进度条
1.1.1   

常用属性:
style  进度条样式
android:max 进度最大值
android:progress 进度值
setMax(intmax)  设置进度最大值
常用方法:
setMax(intmax)  设置进度最大值
getMax() 获取进度最大值
setProgress(intprogrss)  设置进度值
getProgress()  获取进度值
 
==练习
<ProgressBar 
       android:id="@+id/pdar1"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
 style="?android:attr/progressBarStyleHorizontal"
        android:max="100"
       android:progress="30"/>
@Override
         publicvoid onClick(View v) {
                   //TODO Auto-generated method stub
                   switch(v.getId()) {
                   caseR.id.btn_add:
                            pdar1.setProgress(pdar1.getProgress()+ 10);
                            break;
                   caseR.id.btn_minus:
                            pdar1.setProgress(pdar1.getProgress()- 10);
                            break;
                   default:
                            break;
                   }
                   tv_progress.setText(pdar1.getProgress()+"%");
         }
 
}
 
         //如果需要执行耗时操作,那么耗时操作就应该放在子线程中执行
 
                   newThread(){
                            booleanisRight = true;  //记录滚动条的滚动方向
                            publicvoid run() {
                                     //自动来回滚动
                                     while(true){
                                               try{
                                                        Thread.sleep(50);
                                                        //获取当前进度
                                                        int progress = pbar.getProgress();
                                                        //判断当前的进度的位置,如果是0或最大值,就需要改变方向
                                                        if(progress<=0){
                                                                 isRight= true;  //代表方向往右
                                                        }elseif(progress >= pbar.getMax()){
                                                                  isRight = false;  //代表方向往左
                                                        }
                                                        
                                                        //根据滚动的方向修改滚动条的值
                                                        if(isRight){
                                                                 pbar.setProgress(pbar.getProgress()+1);
                                                        }else{
                                                                 pbar.setProgress(pbar.getProgress()-1);
                                                        }
                                               }catch (InterruptedException e) {
                                                        //TODO Auto-generated catch block
                                                        e.printStackTrace();
                                               }
                                     }
                            }
                   }.start();
】
 
1.1.2  练习触摸事件实现快进效果
【
         publicclass MainActivity extends Activity {
 
         privateButton button1;
         privateSeekBar seekBar1;
         privateSeekBarAutoRun seekBarAutoRun;
         @Override
         protectedvoid onCreate(Bundle savedInstanceState) {
                   super.onCreate(savedInstanceState);
                   setContentView(R.layout.activity_main);
                   
                   findViews();
                   bindListener();
         }
         privatevoid bindListener() {
                   
                   //设置View的触摸事件
                   button1.setOnTouchListener(newOnTouchListener() {
                            
                            @Override
                            publicboolean onTouch(View v, MotionEvent event) {
                                     //TODO Auto-generated method stub
                                     switch(event.getAction()) {
                                     caseMotionEvent.ACTION_DOWN://手指按下
                                               Log.i("msg","手指按下");
                                               //进度条自动开始滚动
                                               if(seekBarAutoRun==null){
                                               seekBarAutoRun= new SeekBarAutoRun();
                                               seekBarAutoRun.start();
                                               }
                                               break;
                                     caseMotionEvent.ACTION_MOVE://手指移动
                                               Log.i("msg","手指移动");
                                               break;
                                     caseMotionEvent.ACTION_UP://手指离开
                                               Log.i("msg","手指离开");
                                               //进度条自动停止滚动
                                               if(seekBarAutoRun!= null){
                                                        seekBarAutoRun.autoStopRunTask();
                                                        seekBarAutoRun= null;
                                               }
                                               break;
                                     default:
                                               break;
                                     }
                                     returntrue;      //事件消费的问题
                            }
                   });
         }
         privatevoid findViews() {
                   
                   button1= (Button) this.findViewById(R.id.button1);
                   seekBar1= (SeekBar) this.findViewById(R.id.seekBar1);
         }
         
         classSeekBarAutoRun extends Thread{
                   @Override
                   publicvoid run() {
                            while(!isInterrupted()){
                                     try{
                                               Thread.sleep(50);
                                               seekBar1.setProgress(seekBar1.getProgress()+ 1);
                                     }catch (InterruptedException e) {
                                               e.printStackTrace();
                                               break;
                                     }
                            }
                   }
                   
                   /**
                    * 停止自动滚动
                    */
                   publicvoid autoStopRunTask(){
                            interrupt();
                   }
         }
}
】
1.1.3  SeekBar
【
SeekBar是ProgressBar的子类,功能很相似
SeekBar可以与用户进行交互,在展示进度的同时允许用户手动改变进度
特有属性和方法:
         android:thumb 设置滑块所使用的图片
         setOnSeekBarChangeListener(listener)  设置滑动监听器
】
 
1.1.4  RatingBar
【特有属性和方法
         android:numberStars     设置星星的数量(默认5颗星)
         android:rating          设置被点亮的星星的个数
         android:stepSize     设置最小评分的颗粒度
         setOnRatingBarChangeListener(listener)  设置监听器
】
 
1.1.5  SeekBar练习
 
【
         private void bindListener() { 
                   seekbar.setOnSeekBarChangeListener(newOnSeekBarChangeListener() {

                            @Override
                            public voidonStopTrackingTouch(SeekBar seekBar) {
                                     // TODOAuto-generated method stub
                            }

                            @Override
                            public voidonStartTrackingTouch(SeekBar seekBar) {
                                     // TODOAuto-generated method stub
                            }

                            @Override
                            public voidonProgressChanged(SeekBar seekBar, int progress,
                                               booleanfromUser) {
                                     if(progress<=30){
                                               //imageview.setImageResource(R.drawable.img1);
                                               imageview.setImageResource(imges[0]);
                                     }elseif(progress<=60){
                                               //imageview.setImageResource(R.drawable.img2);
                                               imageview.setImageResource(imges[1]);
                                     }else if(progress<=90){
                                               //imageview.setImageResource(R.drawable.img3);
                                               imageview.setImageResource(imges[2]);
                                     }
                            }
                   });
         }
】
 
1.2    资源文件
【
1、id
2、布局
3、字符串
4、数组
5、样式和主题
6、菜单
7、已编译的任意XML资源文件:res/xml
8、未编译的原始资源文件:res/raw
9、图像
普通图像资源:drawable
xml图像资源:bitmap
图层(Layer)资源:layer-list
图像状态(State)资源:selector
图像级别(Level)资源:level-list
淡入淡出(CrossFade)资源:transition
外形(Shape)资源:shape(shape、gradient、padding、corners、stroke)
10、动画资源
         逐帧动画:res/drawable
         补间动画:res/anim
                   透明度补间动画 alpha
                   缩放补间动画 scale
                   旋转动画 rotate
                   移动补间动画translate
         属性动画:res/animator(api11出现)
逐帧动画:res/drawable
属性动画:res/animator(api11出现)
】
 
1.3    各种资源文件的xml格式
1.3.1  字符串资源
【
Android的国际化和本地化
         internationalization(国际化)简称 i18n,因为在i和n之间还有18个字符
         localization(本地化),简称L10n
 
         一般说明一个地区的语言时,用语言-地区的形式,如  zh-CN, zh-TW
 
//获取字符串资源
                   StringssString = getResources().getString(R.string.app_name);
                   getString(R.string.app_name);      //等价
】
 
1.3.2  数组资源
【
在Android中,推荐使用数组资源文件来定义数组
 
位置:res/values/arrays.xml
 
<?xml version="1.0"encoding="utf-8"?>
<resources>
   <!-- 字符串数组 -->
   <string-array name="nameaa">
       <item>小明</item>
       <item>小亮</item>
    </string-array>
    
   <!-- 整型数组资源 -->
   <integer-array name="interarray">
       <item>1</item>
       <item>2</item>
    </integer-array>
 
</resources>
 
//字符串数组
                   String[]names=getResources().getStringArray(R.array.nameaa);
                   Log.i("MainActivity",names.toString());

                   //获取整型数组资源
                   int[] intArray=getResources().getIntArray(R.array.interarray);
                   Log.i("MainActivity",intArray.toString());
】
 
1.3.3  原始xml资源
【
         位置:res/xml目录下
 
Java代码中的获取方式:getResources().getXml(R.xml.文件名称)
 
<?xml version="1.0"encoding="UTF-8"?>
<books>
         <bookid="1">
                   <name>哈利波特</name>
                   <price>99.9</price>
         </book>
         <bookid="2">
             <name>Thinking In Java</name>
                   <price>120</price>
         </book>
         <bookid="3">
             <name>小李飞刀</name>
                   <price>50</price>
         </book>
 
</books>
 
//原始xml资源
                   XmlResourceParserparser =getResources().getXml(R.xml.books);
                   //解析省略   
                   //这里注意的是,XmlResourceParser是一个pull解析器,不过多了一个方法,就是close方法
                   //在解析完xml文件后,记得一定要调用close()方法释放资源
】
 
1.3.4  图像资源
【可以新建一个与分辨率无关适配的图形资源文件夹:drawble
1、普通图像资源
2、  图像状态(selector)资源
slt_play.xml
<?xml version="1.0"encoding="utf-8"?>
<selectorxmlns:android="http://schemas.android.com/apk/res/android" >    
   <item android:state_pressed="true"android:drawable="@drawable/play_pressed"></item>
         <itemandroid:state_pressed="false"android:drawable="@drawable/play"></item>
 
</selector>
 
引用:
android:background="@drawable/slt_play"
3、  外形(shape)资源
渐变色、倒圆角、尺寸、内边距、
 
   <?xml version="1.0" encoding="utf-8"?>
shape
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape=["rectangle" | "oval" |"line" | "ring"] >
      <!—倒圆角-->
<corners
            android:radius="integer"
            android:topLeftRadius="integer"
           android:topRightRadius="integer"
           android:bottomLeftRadius="integer"
           android:bottomRightRadius="integer" />
<!—渐变效果设置-->
gradient
           android:angle="integer"
           android:centerX="integer"
           android:centerY="integer"
           android:centerColor="integer"
           android:endColor="color"
           android:gradientRadius="integer"
           android:startColor="color"
           android:type=["linear" | "radial" |"sweep"]
           android:useLevel=["true" | "false"] />
padding
           android:left="integer"
           android:top="integer"
           android:right="integer"
           android:bottom="integer" />
size
           android:width="integer"
           android:height="integer" />
<!--填充图像的颜色,和渐变色是冲突的,如果设置了solid属性,那么渐变色就会失效-->
 <solid
           android:color="color" />
<!-- 边框 -->
 <stroke
           android:width="integer"
            android:color="color"
           android:dashWidth="integer"
           android:dashGap="integer" />
</shape>
 
引用:
android:background="@drawable/shape_demo"
 
 
<?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:drawable="@drawable/shape_cenert_item_press"android:state_focused="true"/>
     <item android:drawable="@drawable/shape_cenert_item_press"android:state_focused="false" android:state_pressed="true"/>
     <item android:drawable="@drawable/shape_center_item_mornal"android:state_focused="false"/>
 </selector> 
】
 
1.3.5  样式和主题
【
在代码中可以通过style和theme来提高代码的复用性和可维护性。
样式和主题的区别
         作用范围不同,样式作用于单个小控件,而主题作用于Activity或整个APP
         引用位置不同,样式都是在布局文件中被引用,而主题是在清单文件中被引用
 
Values\ styles.xml
 

   <!-- 自定义控件样式 -->
   <style name="text_style">
       <item name="android:textColor">#F00</item>
       
   </style>
    
<stylename="text_style2" parent="text_style">
        <itemname="android:textStyle">italic</item>       
</style>
//注意:样式可以实现继承
引用:
 style="@style/text_style2"

主题:定义同样式,在Style.xml中,引用的形式不同:是在清单文件中引用。
            <style name="red_XYSTheme">
       <item name="android:background">#D2E6D7</item>
   </style>
   <style name="blue_XYSTheme" parent="@android:style/Theme.DeviceDefault.Dialog.NoActionBar">
       <item name="android:background">#32FE32</item>
       <!-- 设置标题栏的高度 -->
       <item name="android:windowTitleSize">40dip</item>
   </style>
   <style name="girl_XYSTheme">
        <!-- 用图片作为主题背景-->
        <item name="android:windowBackground">@drawable/abc</item>
        <!-- 无标题栏 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 全屏 -->
        <item name="android:windowFullscreen">true</item>
</style>
在清单文件中引用:
<activity
           android:name="com.example.day05theme.Activity2"
           android:theme="@style/blue_XYSTheme"/>
  <activityandroid:name="com.example.day05theme.Activity3" 
           android:theme="@style/girl_XYSTheme"/>
 
】
 
1.4    其他资源文件
Values下的
color:颜色资源
                   位置:res/values/colors.xml
dimen:尺寸资源
                   位置:res/values/dimens.xml
id:id资源
【常见使用形式:values
<?xml version="1.0"encoding="utf-8"?>
<resources>
<!--id资源 -->
<item type="id"name="tv1"/>
</resources>
引用:
android:id="@id/tv2"
】

                   使用的注意事项:

                   1)在布局中引用id资源的话,必须要保证在引用之前先创建过这个id

                      也可以在引用时候使用@+id,保证id肯定存在,

                      PS:@+id的意思就是在使用这个id之前先会判断id是否存在,如果不存在就创建,如果存在就直接引用

                   2)在同一个布局文件中不能出现同名的id,但是在不同的布局文件中可以出现相同的id

                   3)我们可以预先将需要使用的id全部抽取出来作为资源定义在资源文件中

        

         提示:在Android支持资源类型有很多,如果要学习其他资源的使用,那么建议查看官方文档进行学习,如果要看资源使用的格式,可以查看SDK自带的资源文件,SDK自带的资源文件位置:SDK根目录\platforms\android-XX\data\res