轮播图Viewpager支持手动滑动定时滑动和自动加载图片页数

首先来分析布局结构吧


外面是个 FrameLayout 因为文字需要覆盖在image上面

接下来就是引入
    android.support.v4.view.ViewPager
    下面的文字和点用线性布局

main_layout
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    
 <FrameLayout 
     android:id="@+id/fl"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content">
    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="190dp"/>
    
    <LinearLayout
        android:layout_marginTop="145dp"
        android:gravity="center_vertical"
        android:background="#66000000"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="45dp">
         <TextView
            android:id="@+id/title"
            android:text="abcdefg ,hijklmn,opqrdt"
            android:textColor="#ffffff"
            android:maxLines="2"
            android:ellipsize="end"
            android:lineSpacingMultiplier="1.2"
            android:gravity="center_vertical"
            android:layout_marginLeft="5dp"
            android:layout_weight="5"
            android:layout_width="0dp"
            android:layout_height="match_parent" />
        
        <LinearLayout
            android:id="@+id/dot_ll"
            android:layout_weight="3"
            android:orientation="horizontal"
            android:gravity="end|bottom"
            android:padding="9dp"
            android:layout_width="0dp"
            android:layout_height="match_parent">


        </LinearLayout>
    </LinearLayout>
    </FrameLayout>
<ImageView 
    android:layout_below="@id/fl"
    android:id="@+id/iv"
    android:scaleType="center"
    android:layout_width="wrap_content" android:layout_height="wrap_content"/>

</RelativeLayout>




 
  对了还有个点样式 
 
<shape xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="oval">
    <solid android:color="#ffffff"/>
    <corners android:radius="6dp"/>
</shape>

shape 形状
solid  线的 颜色
corners 半径



GSON 顺便提一下

比如json字符串为:[{"name":"name0","age":0}]

代码:

Person person = gson.fromJson(str, Person.class);

提供两个参数,分别是json字符串以及需要转换对象的类型。

第二种,转换成列表类型:

代码:

List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());
for(int i =0; i < ps.size() ; i++)
{
Person p
= ps.get(i);
System.out.println(p.toString());
}

那么开始步入主题了

分析
    实现滑动用到适配器pageradapter
    实现定时切换  可以用到handler定时发送消息 和timer定时器,等,这里我们就用handler
      还有一点,就是当滑到第一个还要向左滑动,让它切换到到最后一个,如何处理?同理最后    一个pager
    
    这里加载网络就用volley吧,为了方便因为这不是我们的重点

好了,上代码

public class MainActivity extends Activity {
	
	private static final String url = "http://news-at.zhihu.com/api/4/news/latest";
	
	private static final int MSG = 0x10 ;

	private static final int MSG_SCROLL = 1;
	
	private static final int  Defalut_postion= 100;
	
	private static final int isError = 10000;
	
	private  boolean  isScroll = true ;
	
	private BannerAdapter bannerAdapter;

	protected int mBannerPosition = 0;

	private ImageView [] imgs;
	

	private TextView tv_title;
	
	private ViewPager pager;
	private LinearLayout ll_dots;

    public ImageLoader imageLoader = ImageLoader.getInstance();

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
                //Added in the code by me for handling the init error
        imageLoader.init(ImageLoaderConfiguration.createDefault(getBaseContext()));
        return true;
    }
	
	private Handler handler = new Handler(){
		private ItemText infoBean;
		private List<Story> storyList;

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			super.handleMessage(msg);
			if (msg.what == MSG) {
				infoBean = (ItemText) msg.obj;
				storyList = infoBean.stories;
				if(storyList.size() > 0 && storyList != null){
					initAfterView(storyList);
				}else{
					tv_title.setText("郁闷。。网络有问题");
				}
				
				}
			if (msg.what == MSG_SCROLL) {
				Log.i("mBannerPosition","位置="+mBannerPosition);
				if(isScroll){
					int max = infoBean.stories.size();  
	             	Log.i("max","位置="+max);
	             	int position =  (mBannerPosition + 1) % Defalut_postion; 
	   
	             	if (position == max) { // 最后一页时回到第一页  
                	 pager.setCurrentItem(0, false);  
	             	}else{
                		Log.i("cuurrent","位置="+position);
                	 pager.setCurrentItem(position);
	             	}
	             	if(storyList != null || storyList.size() == 0){
	             		setTitle(storyList);
	             	}else{
	             		tv_title.setText("郁闷。。网络有问题");
	             	}
				handler.removeMessages(MSG_SCROLL);
	            	handler.sendEmptyMessageDelayed(MSG_SCROLL, 2000);
				}
			}
			
			if(msg.what == isError){
				tv_title.setText("郁闷。。网络有问题");
			}
		}
	};


	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ImageView iv =	(ImageView) findViewById(R.id.iv);
		BitmapUtils mBitmapUtils = new BitmapUtils(this);
		//mBitmapUtils.display(iv, "http://pic1.zhimg.com//6387f9f8cafb0719c15067a7f5659474.jpg");
		init();
	}

	private void init() {
		// TODO Auto-generated method stub
	
		initView();
		
		initData();
		
		handler.sendEmptyMessageDelayed(MSG_SCROLL, 2000);
		
		initEvent();
	}

	private void initEvent() {
		pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
	            @Override
	            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
	            	
	            }

	            @Override
	            public void onPageSelected(int position) {
	                mBannerPosition = position;
	                setIndicator(position);
	              
	              
	            }

	            @Override
	            public void onPageScrollStateChanged(int state) {
	            
	            }
	        });
		
		pager.setOnTouchListener(new View.OnTouchListener() {
			
			@Override
			public boolean onTouch(View arg0, MotionEvent arg1) {
				// TODO Auto-generated method stub
		
				if(arg1.getAction() == MotionEvent.ACTION_UP){
					isScroll = true ;
					handler.sendEmptyMessageDelayed(MSG_SCROLL, 2000);
				}else {
					isScroll = false ;
				}
				return false;
			}
		});
	}

	protected void setTitle2(int position) {
		// TODO Auto-generated method stub
		
	}

	protected void setIndicator(int position) {
		// TODO Auto-generated method stub
		for (ImageView img : imgs) {
			img.setBackgroundResource(R.drawable.dot_normal);
		}
		imgs[position].setBackgroundResource(R.drawable.dot_focused);
	}

	private void initView() {
		pager = (ViewPager) findViewById(R.id.view_pager);
		ll_dots = (LinearLayout) findViewById(R.id.dot_ll);
		
		tv_title = (TextView) findViewById(R.id.title);
		
	
	}

	private void initDotas(List<Story> storyList) {
		imgs = new ImageView[storyList.size()];
		// TODO Auto-generated method stub
		for (int i = 0; i < storyList.size(); i++) {
			ImageView img = new ImageView(this);
			LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(6,6);
			params.rightMargin = 8;
			img.setLayoutParams(params);
			img.setBackgroundResource(R.drawable.dot_normal);
			ll_dots.addView(img, params);
			imgs[i] = img;
		}
		
	}

	//  return jsonstr.substring(jsonstr.indexOf("{")).replace("\r\n","\n");   
	private void initData() {
		Volley volley = new Volley();
		RequestQueue queue = volley.newRequestQueue(this);
		// TODO Auto-generated method stub
		StringRequest request = new StringRequest(Request.Method.GET ,url, new Listener<String>() {
			private String str;

			@Override
			public void onResponse(String response) {
				 try {
					 byte[] bytes = response.getBytes(); 
					 str = new String(bytes, "gb2312"); 
				} catch (UnsupportedEncodingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				if(str != null){
				ItemText  infoBean = new Gson().fromJson(str,ItemText.class );
				Log.i("response", response);
				Message message = new Message();
				message.obj = infoBean;
				message.what = 	MSG;
				handler.sendMessage(message);
				}else{
					Message message = new Message();
					message.what = 	isError;
					handler.sendMessage(message);
				}
				
				
				
			}
		}, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError error) {
				// TODO Auto-generated method stub
				
			}
		});
		queue.add(request);
	}
	
	private void initAfterView(List<Story> storyList) {
		bannerAdapter = new BannerAdapter(this ,storyList);
		pager.setAdapter(bannerAdapter);
		initDotas(storyList);
		setTitle(storyList);
	}

	private void setTitle(List<Story> storyList) {
		
			tv_title.setText(""+check(storyList.get(mBannerPosition).title));
			Log.i("mBannerPositionsetTitle==", "=="+mBannerPosition);
			Log.i("storyList.get(mBannerPosition).title", "=="+storyList.get(mBannerPosition).title);
		
		
	}

	private String check(String title) {
		// TODO Auto-generated method stub
		if(title == null)
			return "";
		else 
			return title;
	}
	
	
}


adapter
public class BannerAdapter extends PagerAdapter {
	private List<Story> bannerLsit;
	private Context mContext ;
	private BitmapUtils mBitmapUtils;
	public  BannerAdapter(Context mContext ,List<Story> storyList){
		this.mContext = mContext;
		this.bannerLsit = storyList;
		mBitmapUtils = new BitmapUtils(mContext);
	}
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return bannerLsit != null ? bannerLsit.size() : 0;
	}

	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		// TODO Auto-generated method stub
		return arg1 == arg0;
	}
	
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {
		// TODO Auto-generated method stub
		   container.removeView((View) object);
	}
	
	@Override
	public int getItemPosition(Object object) {
		// TODO Auto-generated method stub
		return POSITION_NONE;
	}
	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		// TODO Auto-generated method stub
	    View view = LayoutInflater.from(mContext).inflate(R.layout.item, container, false);
		ImageView iv = (ImageView) view.findViewById(R.id.image);
		String abc = bannerLsit.get(position).images.get(0);
		mBitmapUtils.display(iv,bannerLsit.get(position).images.get(0));
		container.addView(view);
		return view;
	}

	
	@Override
	public void unregisterDataSetObserver(DataSetObserver observer) {
		// TODO Auto-generated method stub
		super.unregisterDataSetObserver(observer);
	}
	
	@Override
	public void notifyDataSetChanged() {
		// TODO Auto-generated method stub
		super.notifyDataSetChanged();
	}
	
	@Override
	public void registerDataSetObserver(DataSetObserver observer) {
		// TODO Auto-generated method stub
		super.registerDataSetObserver(observer);
	}
	
	@Override
	public void finishUpdate(ViewGroup container) {
		// TODO Auto-generated method stub
		super.finishUpdate(container);
	}
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值