android API Demo之使用ViewFlipper制作轮播广告

ViewFlipper官网的介绍:Simple ViewAnimator that will animate between two or more views that have been added to it. Only one child is shown at a time. If requested, can automatically flip between each child at a regular interval.

大概意思是:ViewFlipper是一个view容器,可以放置两个或者两个以上的view,每次只能显示一个view,但是可以在一定周期下有规律的一个一个的显示view。

       首先,ViewFlipper怎么使用呢?

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dip" >

        <ViewFlipper
            android:id="@+id/flipper"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dip"
            android:flipInterval="3000" >

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv1" />

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv2" />

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv3" />

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv4" />

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv5" />
        </ViewFlipper>
       
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dip"
        android:text="Select an animation:" />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

activity:

public class ViewFlipperActivity extends Activity implements AdapterView.OnItemSelectedListener{
	 private String[] mStrings = {
	            "Push up", "Push left"};

	 private ViewFlipper mFlipper;
	 
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_viewflipper);
        
        mFlipper = ((ViewFlipper) this.findViewById(R.id.flipper));
        mFlipper.startFlipping();
        
        Spinner s = (Spinner) findViewById(R.id.spinner);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, mStrings);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s.setAdapter(adapter);
        s.setOnItemSelectedListener(this);
    }
	@Override
	public void onItemSelected(AdapterView<?> parent, View view, int position,
			long id) {
		switch (position) {
		case 0:
			mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_up_in));
			mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_up_out));
			break;
		case 1:
			mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
			mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
			break;
		default:
			break;
		}
	}

	@Override
	public void onNothingSelected(AdapterView<?> parent) {
		// TODO Auto-generated method stub
		
	}
	
}

动画文件:

push_up_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="500"/>
	<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500"/>
</set>
push_up_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromYDelta="0" android:toYDelta="-100%p" android:duration="500"/>
	<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500"/>
</set>
push_left_in.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="500"/>
	<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500"/>
</set>

push_left_out.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="500"/>
	<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="500"/>
</set>

效果图:



至此,我们是不是还缺点什么,没错,广告板右下角的小图标识。我们把界面的布局文件改一下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dip" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="100dp" >

        <com.example.learning.apidemo.animation.util.MyViewFlipper
            android:id="@+id/flipper"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dip"
            android:flipInterval="3000" >

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv1" />

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv2" />

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv3" />

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv4" />

            <ImageView
                android:layout_width="fill_parent"
                android:layout_height="100dp"
                android:background="@drawable/adv5" />
        </com.example.learning.apidemo.animation.util.MyViewFlipper>
        <LinearLayout 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:orientation="horizontal"
            >
        <ImageView
            android:id="@+id/img1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:drawable/presence_online"
            />
        <ImageView 
            android:id="@+id/img2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:drawable/presence_invisible"
            />
        <ImageView 
            android:id="@+id/img3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:drawable/presence_invisible"
            />
        <ImageView 
            android:id="@+id/img4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:drawable/presence_invisible"
            />
        <ImageView 
            android:id="@+id/img5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@android:drawable/presence_invisible"
            />
        </LinearLayout>
    </RelativeLayout>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="5dip"
        android:text="Select an animation:" />

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
并且重写ViewFlipper,为什么要重写呢?因为,ViewFlipper并没有切换图片的监听接口,我们要在切换图片的时候改变ImageView的背景图片,标识当前是第几个图片

MyViewFlipper.java

public class MyViewFlipper extends ViewFlipper{
	private OnViewChange onViewChange;
	public MyViewFlipper(Context context) {
		super(context);
	}

	public MyViewFlipper(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	@Override
	public void showNext() {
		super.showNext();
		if(onViewChange!=null){
			onViewChange.onChange(getDisplayedChild());
		}
	}
	
	@Override
	public void showPrevious() {
		super.showPrevious();
		if(onViewChange!=null){
			onViewChange.onChange(getDisplayedChild());
		}
	}
	public interface OnViewChange{
		void onChange(int index);
	}
	public OnViewChange getOnViewChange() {
		return onViewChange;
	}

	public void setOnViewChange(OnViewChange onViewChange) {
		this.onViewChange = onViewChange;
	}
}
MyViewFlipper内部声明了一个接口OnViewChange,并重写showNext()和showPrevious(),在这两个方法内调用OnViewChange的onChange()
,传入的参数代表当前显示图片的索引。

activity:

public class ViewFlipperActivity extends Activity implements AdapterView.OnItemSelectedListener{
	 private String[] mStrings = {
	            "Push up", "Push left"};

	 private MyViewFlipper mFlipper;
	 
	 private ImageView img1,img2,img3,img4,img5;
	 
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_viewflipper);
        img1=(ImageView) findViewById(R.id.img1);
        img2=(ImageView) findViewById(R.id.img2);
        img3=(ImageView) findViewById(R.id.img3);
        img4=(ImageView) findViewById(R.id.img4);
        img5=(ImageView) findViewById(R.id.img5);
        mFlipper = ((MyViewFlipper) this.findViewById(R.id.flipper));
        mFlipper.startFlipping();
        mFlipper.setOnViewChange(new OnViewChange() {
			
			@Override
			public void onChange(int index) {
				setIndexView(index);
			}
		});
        Spinner s = (Spinner) findViewById(R.id.spinner);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, mStrings);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s.setAdapter(adapter);
        s.setOnItemSelectedListener(this);
    }
	@Override
	public void onItemSelected(AdapterView<?> parent, View view, int position,
			long id) {
		switch (position) {
		case 0:
			mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_up_in));
			mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_up_out));
			break;
		case 1:
			mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
			mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
			break;
		default:
			break;
		}
	}

	@Override
	public void onNothingSelected(AdapterView<?> parent) {
		// TODO Auto-generated method stub
		
	}
	/**
	 * 
	 * 2014-12-8 下午1:58:36
	 * @param index
	 * @TODO 改变右下角图标的背景
	 */
	private void setIndexView(int index){
		img1.setBackgroundResource(android.R.drawable.presence_invisible);
		img2.setBackgroundResource(android.R.drawable.presence_invisible);
		img3.setBackgroundResource(android.R.drawable.presence_invisible);
		img4.setBackgroundResource(android.R.drawable.presence_invisible);
		img5.setBackgroundResource(android.R.drawable.presence_invisible);
		switch (index) {
		case 0:
			img1.setBackgroundResource(android.R.drawable.presence_online);
			break;
		case 1:
			img2.setBackgroundResource(android.R.drawable.presence_online);
			break;
		case 2:
			img3.setBackgroundResource(android.R.drawable.presence_online);
			break;
		case 3:
			img4.setBackgroundResource(android.R.drawable.presence_online);
			break;
		case 4:
			img5.setBackgroundResource(android.R.drawable.presence_online);
			break;
		default:
			break;
		}
	}
}

改造之后的效果图如下:


这样横竖的广告轮播功能就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值