android ViewPager实现循环滚动效果

实现仿优酷定时切换广告条效果,如下:




自定义 圆点指示器

package com.example.viewpagertest.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import com.example.viewpagertest.R;

public class FlowIndicator extends View {
	private static final boolean DEBUG = true;
	private int count;
	private float space, radius;
	private int point_normal_color, point_seleted_color;

	// 选中
	private int seleted = 0;

	// background seleted normal

	public FlowIndicator(Context context, AttributeSet attrs) {
		super(context, attrs);
		TypedArray a = context.obtainStyledAttributes(attrs,
				R.styleable.FlowIndicator);

		count = a.getInteger(R.styleable.FlowIndicator_count, 4);
		space = a.getDimension(R.styleable.FlowIndicator_space, 9);
		radius = a.getDimension(R.styleable.FlowIndicator_point_radius, 9);

		point_normal_color = a.getColor(
				R.styleable.FlowIndicator_point_normal_color, 0x000000);
		point_seleted_color = a.getColor(
				R.styleable.FlowIndicator_point_seleted_color, 0xffff07);

		int sum = attrs.getAttributeCount();
		if (DEBUG) {
			String str = "";
			for (int i = 0; i < sum; i++) {
				String name = attrs.getAttributeName(i);
				String value = attrs.getAttributeValue(i);
				str += "attr_name :" + name + ": " + value + "\n";
			}
			Log.i("attribute", str);
		}
		a.recycle();
	}

	public void setSeletion(int index) {
		this.seleted = index;
		invalidate();
	}

	public void setCount(int count) {
		this.count = count;
		invalidate();
	}

	public void next() {
		if (seleted < count - 1)
			seleted++;
		else
			seleted = 0;
		invalidate();
	}

	public void previous() {
		if (seleted > 0)
			seleted--;
		else
			seleted = count - 1;
		invalidate();
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Paint paint = new Paint();
		paint.setAntiAlias(true);

		float width = (getWidth() - ((radius * 2 * count) + (space * (count - 1)))) / 2.f;

		for (int i = 0; i < count; i++) {
			if (i == seleted)
				paint.setColor(point_seleted_color);
			else
				paint.setColor(point_normal_color);
			canvas.drawCircle(width + getPaddingLeft() + radius + i
					* (space + radius + radius), getHeight() / 2, radius, paint);

		}
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		setMeasuredDimension(measureWidth(widthMeasureSpec),
				measureHeight(heightMeasureSpec));
	}

	private int measureWidth(int measureSpec) {
		int result = 0;
		int specMode = MeasureSpec.getMode(measureSpec);
		int specSize = MeasureSpec.getSize(measureSpec);

		if (specMode == MeasureSpec.EXACTLY) {
			result = specSize;
		} else {
			result = (int) (getPaddingLeft() + getPaddingRight()
					+ (count * 2 * radius) + (count - 1) * radius + 1);
			if (specMode == MeasureSpec.AT_MOST) {
				result = Math.min(result, specSize);
			}
		}
		return result;
	}

	private int measureHeight(int measureSpec) {
		int result = 0;
		int specMode = MeasureSpec.getMode(measureSpec);
		int specSize = MeasureSpec.getSize(measureSpec);

		if (specMode == MeasureSpec.EXACTLY) {
			result = specSize;
		} else {
			result = (int) (2 * radius + getPaddingTop() + getPaddingBottom() + 1);
			if (specMode == MeasureSpec.AT_MOST) {
				result = Math.min(result, specSize);
			}
		}
		return result;
	}

}


attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="FlowIndicator">
        <attr name="count" format="integer" />
        <attr name="space" format="dimension" />
        <attr name="point_size" format="dimension" />
        <attr name="point_seleted_color" format="color|reference" />
        <attr name="point_normal_color" format="color|reference" />
        <attr name="point_radius" format="dimension" />
    </declare-styleable>

</resources>



activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.example.viewpagertest"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="150dp" 
        android:background="#248BD4">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="fill_parent"
            android:layout_height="140dp"
            android:layout_gravity="center" />

        <com.example.viewpagertest.view.FlowIndicator
            android:id="@+id/mIndicator"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="5dip"
            app:count="2"
            app:point_normal_color="#196194"
            app:point_radius="3dp"
            app:point_seleted_color="#ffffff"
            app:point_size="5dip"
            app:space="12dip" />
    </RelativeLayout>
    
</RelativeLayout>


MainActivity.java

package com.example.viewpagertest;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.viewpagertest.view.FlowIndicator;

public class MainActivity extends Activity {

	private ViewPager mViewPager;
	private FlowIndicator mIndicator;
	private List<View> viewList = new ArrayList<View>();
	private MyViewPagerAdapter mViewPagerAdapter;
	private int random;
	private static final int CHANGE_VP = 0;
	private Timer mTimer;
	
	private Handler handler = new Handler(){
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case CHANGE_VP:
				int item = msg.arg1%2;
				mViewPager.setCurrentItem(item,false);
				
				break;

			default:
				break;
			}
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		findView();
	}
	
	@Override
	protected void onResume() {
		
		if(mTimer==null){	//保证只有一个 定时任务
			mTimer = new Timer(true);
//			mTimer.scheduleAtFixedRate(new MyTask(), 0, 15000);
			mTimer.schedule(new MyTask(), 5000, 5000);
		}
		super.onResume();
	}
	
	@Override
	protected void onStop() {
		
		if(mTimer!=null){
			mTimer.cancel();
			mTimer = null;
		}
		super.onStop();
	}
	
	private class MyTask extends TimerTask {

		@Override
		public void run() {
			
			random++;
			Message msg = Message.obtain();
			msg.what = CHANGE_VP;
			msg.arg1 = random;
			handler.sendMessage(msg);
		}
	}

	private void findView() {
		mViewPager = (ViewPager) findViewById(R.id.viewpager);
		mIndicator = (FlowIndicator) findViewById(R.id.mIndicator);
		
		LayoutInflater inflater = LayoutInflater.from(this);
		
		View recNumView = inflater.inflate(R.layout.vp_dial_item, null);
		View recMarkView = inflater.inflate(R.layout.vp_mark_item, null);

		viewList.add(recNumView);
		viewList.add(recMarkView);

		mViewPagerAdapter = new MyViewPagerAdapter(viewList);
		mViewPager.setAdapter(mViewPagerAdapter);
		mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
			
			@Override
			public void onPageSelected(int arg0) {
				
				mIndicator.setSeletion(arg0);
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub
				
			}
		});
	}
	
	public class MyViewPagerAdapter extends PagerAdapter {
		private List<View> myViewList;

		public MyViewPagerAdapter(List<View> mListViews) {
			this.myViewList = mListViews;// 构造方法,参数是我们的页卡,这样比较方便。
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView(myViewList.get(position));// 删除页卡
		}

		@Override
		public Object instantiateItem(ViewGroup container, int position) { // 这个方法用来实例化页卡
			container.addView(myViewList.get(position), 0);// 添加页卡
			return myViewList.get(position);
		}

		@Override
		public int getCount() {
			return myViewList.size();// 返回页卡的数量
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;// 官方提示这样写
		}
	}
}



工程下载地址:http://download.csdn.net/detail/fx_sky/6377233






  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android横向无限循环滚动组件通常是指可以在横向方向上无限循环滚动的控件,常见的例子是轮播图组件。使用这样的组件可以实现在一组图片或其他视图之间平滑无缝地进行循环滚动显示。 在Android开发中,我们可以使用RecyclerView和ViewPager实现这样的横向无限循环滚动组件。 使用RecyclerView来实现横向无限循环滚动组件的步骤如下: 1. 在布局文件中添加一个RecyclerView控件。 2. 创建一个RecyclerViewAdapter来管理数据和视图的显示。 3. 在RecyclerViewAdapter中实现循环滚动的逻辑,即在获取数据数量时设置为一个较大的数值,同时在对应位置获取数据时使用取余操作来实现循环滚动效果。 4. 将RecyclerViewAdapter设置给RecyclerView控件。 使用ViewPager实现横向无限循环滚动组件的步骤如下: 1. 在布局文件中添加一个ViewPager控件。 2. 创建一个PagerAdapter来管理数据和视图的显示。 3. 在PagerAdapter中实现循环滚动的逻辑,即在获取数据数量时设置为一个较大的数值,同时在对应位置获取数据时使用取余操作来实现循环滚动效果。 4. 将PagerAdapter设置给ViewPager控件。 需要注意的是,在实现循环滚动效果时,需要根据具体的需求设置相应的滚动动画和手势操作等。另外,如果使用RecyclerView进行实现,还可以通过自定义LayoutManager来实现更加灵活的布局管理。总之,通过以上方法,我们可以实现Android横向无限循环滚动组件的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值