Android界面编程之七 第六组UI组件:ViewAnimator及其子类

ViewAnimator是一个基类,它继承了FrameLayout,可以将多个View组件 叠在一起;可在切换View时表现动画效果
20141029100750657.png
ViewAnimator 支持的常见XML属性有:
android:animateFistView
显示第一个View组件时是否显示动画
android:inAnimation
设置ViewAnimator显示组件时使用的动画
android:outAnimation
设置ViewAnimator隐藏组件时使用的动画
实际项目中一般使用ViewAnimator的几个子类

2.7.1 ViewSwitcher的功能与用法
为了给ViewSwitcher添加多个组件,一般通过调用ViewSwitcher的SetFactory(ViewSwitcher.ViewFactory)方法为之设置ViewFactory,并由该ViewFactory为之创建View
示例代码:
public class MainActivity extends ActionBarActivity {

public static final int NUMBER_PER_SCREEN = 12;

public static class DataItem {
public String dataName ;
public Drawable drawable ;
}

private ArrayList<DataItem> items = new ArrayList<DataItem>();
private int screenNo = -1;
private int screenCount ;
ViewSwitcher
switcher ;
LayoutInflater
inflater ;

@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.
activity_main );
inflater = LayoutInflater.from(MainActivity. this );
for ( int i = 0; i < 40; i++) {
String label =
"" + i;
Drawable drawable = getResources().getDrawable(
R.drawable.
ic_launcher );
DataItem item =
new DataItem();
item.
dataName = label;
item.
drawable = drawable;
items .add(item);
}
screenCount = items .size() % NUMBER_PER_SCREEN == 0 ? items .size()
/
NUMBER_PER_SCREEN : items .size() / NUMBER_PER_SCREEN + 1;
switcher = (ViewSwitcher) findViewById(R.id. viewSwitcher );
switcher .setFactory( new ViewFactory()
{
@Override
public View makeView()
{
return inflater .inflate(R.layout. slideviewlist , null );
}
});
next(
null );
}
public void next(View v)
{
if ( screenNo < screenCount -1)
{
screenNo ++;
switcher .setInAnimation( this , R.anim. slide_in_right );
switcher .setOutAnimation( this , R.anim. slide_out_left );
((GridView)
switcher .getNextView()).setAdapter( adapter );
switcher .showNext();
}
}
public void prev(View v)
{
if ( screenNo > 0)
{
screenNo --;
switcher .setInAnimation( this , R.anim. slide_in_right );
switcher .setOutAnimation( this , R.anim. slide_out_left );
((GridView)
switcher .getNextView()).setAdapter( adapter );
switcher .showPrevious();
}
}
private BaseAdapter adapter = new BaseAdapter()
{
@Override
public int getCount()
{
if ( screenNo == screenCount - 1
&&
items .size() % NUMBER_PER_SCREEN != 0)
{
return items .size() % NUMBER_PER_SCREEN ;
}
return NUMBER_PER_SCREEN ;

}
@Override
public DataItem getItem( int position)
{
return items .get( screenNo * NUMBER_PER_SCREEN + position);
}
@Override
public long getItemId( int position)
{
return position;
}
@Override
public View getView( int position,
View convertView, ViewGroup parent)
{
View view = convertView;
if (convertView == null )
{
view =
inflater .inflate(R.layout. labelicon , null );
}
ImageView imageView = (ImageView)
view.findViewById(R.id.
imageview );
imageView.setImageDrawable (getItem(position).
drawable );
TextView textView = (TextView)
view.findViewById(R.id.
textview );
textView.setText(getItem(position).
dataName );
return view;
}
};
}
xml代码:
main.xml
< LinearLayout 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"
   
android:orientation = "vertical" >

   
< ImageView
       
android:id = "@+id/iamge"
       
android:layout_width = "match_parent"
       
android:layout_height = "240px"
       
android:src = "@drawable/lijiang"
       
/>
   
< RatingBar
       
android:id = "@+id/rating"
       
android:layout_width = "wrap_content"
       
android:layout_height = "wrap_content"
       
android:numStars = "5"
       
android:max = "255"
       
android:progress = "255"
       
android:stepSize = "0.5"
       
/>
</ LinearLayout >
slideviewlist.xml
<? xml version = "1.0" encoding = "utf-8" ?>
< GridView
 
xmlns:android = "http://schemas.android.com/apk/res/android"
 
android:layout_width = "match_parent"
 
android:numColumns = "4"
 
android:layout_height = "match_parent" >
   
</ GridView >

2.7.2 图像切换器的功能与用法 ImagesSwitcher
ImageSwitcher继承了ViewSwitcher,并重写了ViewSwitcher的showNext()、showPrevious()方法,因此ImageSwitcher使用起来更加简单。使用ImageSwitcher只要如下两步即可:
1.ImageSwitcher提供一个ViewFactory,该ViewFactory生成View组件必须是ImageView
2.需要切换图片时,只要调用ImageSwitcher的setImageDrawable(Drawable drawable)、setImageResource(int reside) 和setImageURI(Uri uri)方法更换图片即可
示例代码:
public class MainActivity extends ActionBarActivity {

int [] imageIds = new int []
{
R.drawable.
bomb5 , R.drawable. bomb6 , R.drawable. bomb7
, R.drawable.
bomb8 , R.drawable. bomb9 , R.drawable. bomb10
, R.drawable.
bomb11 , R.drawable. bomb12 , R.drawable. bomb13
, R.drawable.
bomb14 , R.drawable. bomb15 , R.drawable. bomb16
};
ImageSwitcher
switcher ;

   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main );
        List<Map<String, Object>> listItems =
       
new ArrayList<Map<String, Object>>();
       
for ( int i = 0; i < imageIds . length ; i++)
        {
        Map<String, Object> listItem =
new HashMap<String, Object>();
        listItem.put(
"image" , imageIds [i]);
        listItems.add(listItem);
        }
       
switcher = (ImageSwitcher) findViewById(R.id. switcher );
       
switcher .setFactory( new ViewFactory()
        {
       
@Override
       
public View makeView()
        {
        ImageView imageView =
new ImageView(MainActivity. this );
        imageView.setScaleType(ImageView.ScaleType.
FIT_CENTER );
        imageView.setLayoutParams(
new ImageSwitcher.LayoutParams(LayoutParams. WRAP_CONTENT ,LayoutParams. WRAP_CONTENT ));
       
return imageView;
        }
        });
        SimpleAdapter simpleAdapter =
new SimpleAdapter( this , listItems,
        R.layout.
cell , new String[]{ "iamge" },
       
new int []{R.id. image1 });
        GridView grid = (GridView) findViewById(R.id.
grid01 );
        grid.setAdapter(simpleAdapter);
        grid.setOnItemSelectedListener(
new OnItemSelectedListener()
        {
       
@Override
       
public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
        {
       
switcher .setImageResource( imageIds [position]);
        }
       
@Override
       
public void onNothingSelected(AdapterView<?> parent)
        {
       
        }
        });
        grid.setOnItemClickListener(
new OnItemClickListener()
        {
       
@Override
       
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
        {
       
switcher .setImageResource( imageIds [position]);
        }
        });
    }
}

2.7.3 文本切换器 TextSwitcher
可指定文本切换时的动画效果
实例代码:
public class MainActivity extends ActionBarActivity {

TextSwitcher
textSwitcher ;
String[]
strs = new String[]
{
"crazy it" ,
"crazy world" ,
"crazy programmer"

};
int curStr ;
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super .onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main );
       
textSwitcher = (TextSwitcher) findViewById(R.id. textSwitcher );
       
textSwitcher .setFactory( new ViewSwitcher.ViewFactory() {

@Override
public View makeView() {
// TODO Auto-generated method stub
TextView tv =
new TextView(MainActivity. this );
tv.setTextSize(40);
tv.setTextColor(Color.
MAGENTA );
return tv;
// return null;
}
});
    }
       
public void next(View source)
        {
       
textSwitcher .setText( strs [ curStr ++ % strs . length ]);
        }
}

2.7.4 ViewFlipper
ViewFlipper可以指定与AdapterViewFlipper相同的XML属性;
ViewFlipper需要开发者通过addView(View v) 添加多个View,而AdapterViewFlipper则只要传入一个Adapter(Adapter负责提供多个View)。






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值