ViewAnimator是一个基类,它继承了FrameLayout,可以将多个View组件 叠在一起;可在切换View时表现动画效果
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;
}
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 >
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
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 ]);
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)。