Android 高级UI组件
1. 进度条 ProgressBar
ProgressBar ,进度条,分为长条形进度条(确定操作耗时时使用)和圆形进度条(不确定操作耗时时使用)。默认样式是圆形进度条。
使用举例:
<ProgressBar
android:id="@+id/indeterminateBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
举例:
package com.mingrisoft;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.WindowManager;
import android.widget.ProgressBar;
import android.widget.Toast;
import java.util.logging.LogRecord;
public class MainActivity extends Activity {
private ProgressBar horizonP;
private int mProgressStatus = 0;
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
horizonP = (ProgressBar) findViewById(R.id.progressBar1);
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0x111) {
horizonP.setProgress(mProgressStatus);
} else {
Toast.makeText(MainActivity.this, "耗时操作已经完成", Toast.LENGTH_SHORT).show();
horizonP.setVisibility(View.GONE);
}
}
};
new Thread(new Runnable() {
public void run() {
while (true) {
mProgressStatus = doWork();
Message m = new Message();
if (mProgressStatus < 100) {
m.what = 0x111;
mHandler.sendMessage(m);
} else {
m.what = 0x110;
mHandler.sendMessage(m);
break;
}
}
}
private int doWork() {
mProgressStatus += Math.random() * 10;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
return mProgressStatus;
}
}).start();
}
}
2. 拖动条 SeekBar
SeekBar ,拖动条,是ProgressBar 的子类。
除了继承过来的属性,还有一个特殊的属性:
-
android:thumb 设置拖动条上的"小圆点"的样式。
使用举例:
<SeekBar
android:id="@+id/seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:max="255"
android:progress="255"
/>
举例:
package com.mingrisoft;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.SeekBar;
public class MainActivity extends AppCompatActivity {
private ImageView image;
private SeekBar seekBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
image = (ImageView) findViewById(R.id.image);
seekBar = (SeekBar) findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar arg0, int progress,
boolean fromUser) {
image.setImageAlpha(progress);
}
@Override
public void onStartTrackingTouch(SeekBar bar) {
}
@Override
public void onStopTrackingTouch(SeekBar bar) {
}
});
}
}
3. 星级评分条 RatingBar
RatingBar ,星级评分条,也是ProgressBar 的子类,组件宽度需设置为wrap_content 。
主要属性:
使用举例:
<!-- 星级评分条 -->
<RatingBar
android:id="@+id/ratingBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
android:rating="0"
android:layout_above="@+id/btn"
android:layout_marginBottom="60dp"/>
4. 显示图像组件 ImageView
ImageView ,用以显示图像。
使用举例:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/my_image"
android:contentDescription="@string/my_image_description"
/>
</LinearLayout>
常用属性:
5. 图像切换显示 ImageSwitcher
ImageSwitcher ,用以切换显示图片。
使用举例:
<ImageSwitcher
android:id="@+id/imageswitcher"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
-
为ImageSwicher 设置Factory (用来为ImageSwicher 制造ImageView ):<imageSwitcher>.setFactory() -
为ImageSwicher 设置触摸监听器:imageSwitcher.setOnTouchListener() -
设置图片资源:<imageSwitcher>.setImageRecource(<int RecourceID>)
举例:实现相册(滑动切换图片)
package com.mingrisoft;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.AnimationUtils;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.ViewSwitcher;
public class MainActivity extends Activity {
private int[] arrayPictures = new int[]{R.mipmap.img01, R.mipmap.img02, R.mipmap.img03,
R.mipmap.img04, R.mipmap.img05, R.mipmap.img06,
R.mipmap.img07, R.mipmap.img08, R.mipmap.img09,
};
private ImageSwitcher imageSwitcher;
private int pictutureIndex;
private float touchDownX;
private float touchUpX;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
imageSwitcher = (ImageSwitcher) findViewById(R.id.imageswitcher);
imageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
ImageView imageView = new ImageView(MainActivity.this);
imageView.setImageResource(arrayPictures[pictutureIndex]);
return imageView;
}
});
imageSwitcher.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
touchDownX = event.getX();
return true;
} else if (event.getAction() == MotionEvent.ACTION_UP) {
touchUpX = event.getX();
if (touchUpX - touchDownX > 100) {
pictutureIndex = pictutureIndex == 0 ? arrayPictures.length - 1 : pictutureIndex - 1;
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.slide_in_left));
imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.slide_out_right));
imageSwitcher.setImageResource(arrayPictures[pictutureIndex]);
} else if (touchDownX - touchUpX > 100) {
pictutureIndex = pictutureIndex == arrayPictures.length - 1 ? 0 : pictutureIndex + 1;
imageSwitcher.setOutAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.slide_out_left));
imageSwitcher.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.anim.slide_in_right));
imageSwitcher.setImageResource(arrayPictures[pictutureIndex]);
}
return true;
}
return false;
}
});
}
}
6. 网格视图组件 GridView
GridView ,网格形式显示组件,网格内数据通过Adapter 将后端数据传向UI界面,样式通过单独的布局文件配置
Adapter :适配器,是后端数据和UI界面间的重要桥梁,复杂为数据集中的每个数据设置一个View。

常用Adapter :
GirdView 主要属性:
使用举例:
<GridView
android:id="@+id/gridView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="100dp"
android:gravity="center"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="5dp">
<GridView>.setAdapter(<Adapter adapter>) :设置Adapter
举例:
package com.mingrisoft;
import android.app.Activity;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class MainActivity extends Activity {
private Integer[] picture = {R.mipmap.img01, R.mipmap.img02, R.mipmap.img03,
R.mipmap.img04, R.mipmap.img05, R.mipmap.img06, R.mipmap.img07,
R.mipmap.img08, R.mipmap.img09, R.mipmap.img10, R.mipmap.img11,
R.mipmap.img12,};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridView gridView= (GridView) findViewById(R.id.gridView);
gridView.setAdapter(new ImageAdapter(this));
}
public class ImageAdapter extends BaseAdapter{
private Context mContext;
public ImageAdapter(Context c){
mContext=c;
}
@Override
public int getCount() {
return picture.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if(convertView==null){
imageView=new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(100, 90));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
}else{
imageView= (ImageView) convertView;
}
imageView.setImageResource(picture[position]);
return imageView;
}
}
}
7. 下拉列表框 Spinner
Spinner , 显示下拉列表。
使用举例:
<Spinner
android:id="@+id/planets_spinner"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
可以使用array 资源文件xml 来定义要在这个下拉列表中填充的数据。在res/values 下新建array.xml 文件,内容举例如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
<item>Jupiter</item>
<item>Saturn</item>
<item>Uranus</item>
<item>Neptune</item>
</string-array>
</resources>
随后设置属性android:entries 为array/planets_arra 即可。
当然也可以通过Adapter ,用Java代码的形式设置
package com.mingrisoft;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String result = parent.getItemAtPosition(position).toString();
Toast.makeText(MainActivity.this,result,Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}
8. 列表视图 ListView
ListView ,列表显示。
使用举例:
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
举例:
package com.mingrisoft;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listview = (ListView) findViewById(R.id.listview);
int[] imageId = new int[]{R.mipmap.img01, R.mipmap.img02, R.mipmap.img03,
R.mipmap.img04, R.mipmap.img05, R.mipmap.img06,
R.mipmap.img07, R.mipmap.img08, R.mipmap.img09,
};
String[] title = new String[]{"刘一", "陈二", "张三", "李四", "王五",
"赵六", "孙七", "周八", "吴九"};
List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
for (int i = 0; i < imageId.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("image", imageId[i]);
map.put("名字", title[i]);
listItems.add(map);
}
SimpleAdapter adapter = new SimpleAdapter(this, listItems,
R.layout.main, new String[] { "名字", "image" }, new int[] {
R.id.title, R.id.image });
listview.setAdapter(adapter);
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Map<String, Object> map = ( Map<String, Object> )parent.getItemAtPosition(position);
Toast.makeText(MainActivity.this,map.get("名字").toString(),Toast.LENGTH_SHORT).show();
}
});
}
}
9. 滚动视图 ScrollView
ScrollVView ,滚动视图,垂直方向滚动(水平方向使用:HorizontalScrollView )。
使用举例:
<ScrollView
android:layout_width="match_parent"
andorid:layout_height="wrap_content">
</ScrollView>
- 内部只能由一个子标签,因此需要多个组件时,需要使用布局
Layout 进行嵌套。
举例:
package com.mingrisoft;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
LinearLayout linearLayout, linearLayout2;
ScrollView scrollView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout = (LinearLayout) findViewById(R.id.ll);
linearLayout2 = new LinearLayout(MainActivity.this);
linearLayout2.setOrientation(LinearLayout.VERTICAL);
scrollView = new ScrollView(MainActivity.this);
scrollView.addView(linearLayout2);
linearLayout.addView(scrollView);
ImageView imageView = new ImageView(MainActivity.this);
imageView.setImageResource(R.mipmap.cidian);
TextView textView = new TextView(MainActivity.this);
textView.setText(R.string.cidian);
linearLayout2.addView(imageView);
linearLayout2.addView(textView);
}
}
<ScrollView>.addView() :添加布局
10. 选项卡
既多标签页。
添加步骤:
-
在布局文件中添加TabHost ,TabWidget ,TabContent (使用FrameLayout )组件。
-
TabHost 的id 使用固定值:@android:id/tabhost -
<TabHost> 中添加LinearLayout 布局管理器,用以添加TabWidget ,TabContent 。 -
LinearLayout 布局管理中,添加TabWidget ,id 使用固定值:@android:id/tabs -
LinearLayout 布局管理中,添加FrameLayout 布局管理器,id 使用固定值:@android:id/tabcontent 使用举例: <?xml version="1.0" encoding="utf-8"?>
<TabHost
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mingrisoft.MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</LinearLayout>
</TabHost>
-
编写各标签页的布局文件。 -
获取并初始化TabHost 组件。
-
获取TabHost : tabHost = (TabHost) findViewById(android.R.id.tabhost);
-
初始化TabHost : tabHost.setup();
-
为TabHost 对象添加标签页。
-
声明LayoutInflater 对象,加载布局资源: LayoutInflater inflater = LayoutInflater.from(this);
inflater.inflate(<布局资源id,如R.layout.tab1>, tabHost.getTabContentView());
-
添加标签页 <tabHost>.addTab(tabHost.newTabSpec("<tab规范化名称,非空,如t>")
.setIndicator("<标签名称>")
.setContent(<布局id,如R.id.liL1>));
|