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

来源:互联网 发布:大专转行数据分析师 编辑:程序博客网 时间:2024/06/07 14:35
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
示例代码:
publicclassMainActivity extends ActionBarActivity {

publicstaticfinalintNUMBER_PER_SCREEN= 12;

publicstaticclassDataItem {
publicString dataName;
publicDrawable drawable;
}

privateArrayList<DataItem> items = new ArrayList<DataItem>();
privateintscreenNo= -1;
privateintscreenCount;
ViewSwitcher
switcher;
LayoutInflater
inflater;

@Override
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main);
inflater= LayoutInflater.from(MainActivity.this);
for(inti = 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(newViewFactory()
{
@Override
publicView makeView()
{
returninflater.inflate(R.layout.slideviewlist,null);
}
});
next(
null);
}
publicvoidnext(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();
}
}
publicvoidprev(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();
}
}
privateBaseAdapter adapter = new BaseAdapter()
{
@Override
publicintgetCount()
{
if(screenNo== screenCount - 1
&&
items.size() %NUMBER_PER_SCREEN!= 0)
{
returnitems.size() %NUMBER_PER_SCREEN;
}
returnNUMBER_PER_SCREEN;

}
@Override
publicDataItem getItem(intposition)
{
returnitems.get(screenNo* NUMBER_PER_SCREEN + position);
}
@Override
publiclonggetItemId(intposition)
{
returnposition;
}
@Override
publicView getView(intposition,
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);
returnview;
}
};
}
xml代码:
main.xml
<LinearLayoutxmlns: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
<?xmlversion="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)方法更换图片即可
示例代码:
publicclassMainActivity 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 =
       
newArrayList<Map<String, Object>>();
       
for(inti = 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(newViewFactory()
        {
       
@Override
       
publicView makeView()
        {
        ImageView imageView =
new ImageView(MainActivity.this);
        imageView.setScaleType(ImageView.ScaleType.
FIT_CENTER);
        imageView.setLayoutParams(
newImageSwitcher.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
       
returnimageView;
        }
        });
        SimpleAdapter simpleAdapter =
new SimpleAdapter(this, listItems,
        R.layout.
cell,newString[]{"iamge"},
       
newint[]{R.id.image1});
        GridView grid = (GridView) findViewById(R.id.
grid01);
        grid.setAdapter(simpleAdapter);
        grid.setOnItemSelectedListener(
newOnItemSelectedListener()
        {
       
@Override
       
publicvoidonItemSelected(AdapterView<?> parent, View view,intposition, long id)
        {
       
switcher.setImageResource(imageIds[position]);
        }
       
@Override
       
publicvoidonNothingSelected(AdapterView<?> parent)
        {
       
        }
        });
        grid.setOnItemClickListener(
newOnItemClickListener()
        {
       
@Override
       
publicvoidonItemClick(AdapterView<?> parent, View view,intposition, long id)
        {
       
switcher.setImageResource(imageIds[position]);
        }
        });
    }
}

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

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

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

@Override
publicView makeView() {
//TODOAuto-generated method stub
TextView tv =
new TextView(MainActivity.this);
tv.setTextSize(40);
tv.setTextColor(Color.
MAGENTA);
returntv;
// 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
原创粉丝点击