声明:学习的书籍《Android应用开发揭秘》,这里记录学习该书籍的日志,引用的相关代码与总结描述,没有商业的用途,完全是自我学习的一个记录,刚刚学习不可避免会出现很多问题,若是有错误还请大家多多批评。
继续学习《android应用开发揭秘》这本书,这里把基础控件的学习进行了分类,下面两篇博客主要是一些常用的效果
一、 拖动效果(Gallery)
拖动效果是现在智能手机的一个不可缺少的功能,Android平台中实现拖动效果,主要是使用了Gallery控件,Gallery英文是画廊的意思,顾名思义存放这显示的图片,存放图片资源容器是继承自BaseAdapter类的派生类。当然我们也可以通过setOnItemClickListener监听其事件。
【注意】Gallery 组件一般用于显示图像列表,因此也可称相册组件 Gallery 与GridView 的区别是Gallery只能水平显示一行,而且支持水平滑动效果。也就是说,单击、选中或拖动Gallery 中的图像,Gallery中的图像列表会根据不同的情况向左或右移动,直到显示最后一个图像为止.
实例分析:基于上述介绍,把要显示的图片资源索引存在一个int类型数组中,并且要显示哪个图片,通过setImageResource方法来设置ImageView要显示的图片。
关键源码:
main.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<Gallery
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/Gallery01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
注意,以下ImageAdapter类继承自BaseAdapter,并重写其方法
public class ImageAdapter extends BaseAdapter {
private Context mContext; // 定义Context
// 定义整型数组 即图片源
private Integer[] mImageIds = {
R.drawable.img1,
R.drawable.img2,
R.drawable.img3,
R.drawable.img4,
R.drawable.img5,
R.drawable.img6,
R.drawable.img7,
R.drawable.img8,
};
public ImageAdapter(Context c) {
this.mContext = c;
}
//获取图片个数
public int getCount() {
return mImageIds.length;
}
//获取图片在图库的位置
public Object getItem(int position) {
return position;
}
// 获取图片ID
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent{
ImageView imageview = new ImageView(mContext);
//给ImageView设置资源
imageview.setImageResource(mImageIds[position]);
//设置布局图片120x120显示
imageview.setLayoutParams(new Gallery.LayoutParams(120,120));
//设置显示比例类型
imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);
return imageview;
}
}
而实际Activity01中只要把adapter付给Gallery对象,并设置监听事件即可“
//获得Gallery对象
Gallery g = (Gallery) this.findViewById(R.id.Gallery01);
//添加ImageAdapter给Gallery对象
g.setAdapter(new ImageAdapter(this));
//设置Gallery对象的监听事件
g.setOnItemClickListener(new OnItemClickListener(){
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Toast.makeText(Examples_04_17Activity.this,"你选择了"+(arg2+1)+" 号图片", Toast.LENGTH_SHORT).show();}
});
实例效果:
二、 切换图片(ImageSwitcher)
该功能类似于很多图片浏览器,上一张下一张图片进行切换,ImageSwitcher在实现该效果时,需要设置一个ViewSwitcher.ViewFactory,注意ViewSwitcher.ViewFactory是个接口,目的:在视图转换器(ViewSwitcher)中创建视图。并通过makeView()方法来显示图片。
公共方法:public abstract View makeView ()
创建一个用于添加到视图转换器(ViewSwitcher)中的新视图
关键源码:
private ImageSwitcher m_Switcher; //创建ImageSwitcher对象
private static int index = 0; //索引
private static final int BUTTON_DOWN_ID = 0x123456; //“下一页”按钮ID
private static final int BUTTON_UP_ID = 0x123457; //“上一页”按钮ID
private static final int SWITCHER_ID = 0x123458; //ImageSwitcher对象的ID
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout main_view = new LinearLayout(this);
m_Switcher = new ImageSwitcher(this); //创建ImageSwitcher对象
main_view.addView(m_Switcher); //在线性布局中添加ImageSwitcher视图
m_Switcher.setId(SWITCHER_ID); //设置ImageSwitcher对象的ID
m_Switcher.setFactory(this); //设置ImageSwitcher对象的数据源
m_Switcher.setImageResource(imagelist[index]);
setContentView(main_view); //设置显示上面创建的线性布局
Button next = new Button(this); //创建“下一张”按钮
next.setId(BUTTON_DOWN_ID);
next.setText("下一张");
next.setOnClickListener(this);
LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(100, 100);
main_view.addView(next, param);
Button pre = new Button(this); //创建“上一张”按钮
pre.setId(BUTTON_UP_ID);
pre.setText("上一张");
pre.setOnClickListener(this);
main_view.addView(pre, param);
}
//事件监听、处理
public void onClick(View v) {
switch(v.getId()){
case BUTTON_DOWN_ID: //下一页
index++;
if (index >= imagelist.length){
index = 0;
}
//ImageSwitcher对象资源索引
m_Switcher.setImageResource(imagelist[index]);
break;
case BUTTON_UP_ID: //上一页
index--;
if (index < 0){
index = imagelist.length - 1;
}
//ImageSwitcher对象资源索引
m_Switcher.setImageResource(imagelist[index]);
break;
default:
break;
}
}
@Override
public View makeView() {
return new ImageView(this); //将所有图片通过ImageView来显示
}
【扩展点】ViewSwitcher
一、结构
public class ViewSwitcher extends ViewAnimator
Java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.FrameLayout
android.widget.ViewAnimator
android.widget.ViewSwitcher
已知直接子类:ImageSwitcher, TextSwitcher
二、概述
在两个视图间转换时显示动画,有一个可以创建这些视图的工厂类。你可以用工厂来创建这些视图,也可以自己创建。一个ViewSwitcher只允许包含两个子视图,且一次仅能显示一个。
(译者注:与ViewFlipper类相似,但该类不常用,常用其两个子类ImageSwitcher:转换图片时增加动画效果; TextSwitcher: 转换文字时增加动画效果; 其实例见apidemos中ImageSwitcher实例和TextSwitcher实例)
三、内部类
interface ViewSwitcher.ViewFactory
在一个ViewSwitcher里创建视图
…………….
五、公共方法
public void setFactory (ViewSwitcher.ViewFactory factory)
设置用来生成将在视图转换器中切换的两个视图的工厂。也可以调用两次 addView(android.view.View, int, android.view.ViewGroup.LayoutParams)来替代使用工厂的方法。
参数: factory 用来生成转换器内容的视图工厂
引用自:http://dev.10086.cn/cmdn/wiki/index.php?doc-view-4764.html
实例效果:
三、网格视图(GridVIew)
网格视图的排列方式与矩阵类似,它所需要显示元素同样适用BaseAdapter来实现,适用方法,类似于Gallery控件
关键代码:
//取得GridView对象
GridView gridview = (GridView) this.findViewById(R.id.gridview);
//添加元素给gridview
gridview.setAdapter(new ImageAdapter(this));
gridview.setBackgroundResource(R.drawable.bg0);
//事件监听
gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id){
Toast.makeText(Activity01.this, "你选择了" + (position + 1) + " 号图片", Toast.LENGTH_SHORT).show();
}
});
四、卷轴视图(ScrollView)
卷轴视图主要用于,一页数据显示不开后,需要滚动来显示的视图。
实例分析:ScrollView定义个线性布局,线性布局中一个TextView以及一个Button,每点击一次按钮就增加一个线性布局。
关键源码:
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ScrollView01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
......
</ScrollView>
在按钮点击事件里:
......
//改变默认焦点切换
buttonView.setOnKeyListener(mNewButtonKeyListener);
//投递一个消息进行滚动
mHandler.post(mScrollToBottom);
private Runnable mScrollToBottom = new Runnable() {
@Override
public void run(){
int off = mLayout.getMeasuredHeight() - mScrollView.getHeight();
if (off > 0) {
mScrollView.scrollTo(0, off);//设置当前视图滚动到的位置
}
}
};
今天学习到P101页