android viewpager 滑动分页以及禁止划屏 (模拟新浪)

在第一篇中,我介绍了ViewPager的应用以及禁用滑向下一页.

这一篇将之加工一下,模拟实现新浪里面的功能,vierpager 分页.

在新浪微博消息一栏中是这样的(注意看title):

上部分页栏可以用gridview来实现,不过为了省事在这就用textview代替了.

贴出代码:

/***
 * ViewPager
 * 
 * @author zhangjia
 * 
 */
public class MainActivity extends ActivityGroup implements OnClickListener {
	private LinearLayout layout;// title
	private ViewPager pager;
	private ArrayList<View> pageViews;
	private LinearLayout layout2;
	private ArrayList<ImageView> imageViews;
	private LinearLayout linearLayout;
	private String title[] = { "one", "two", "three" };
	private TextView textView;
	private ArrayList<View> arrayList;// 用于装载view
	private final int linerlayout_height = 80;

	/***
	 * init title and pageview
	 */
	void Init() {
		arrayList = new ArrayList<View>();
		// 获取屏幕宽度
		int width = getWindowManager().getDefaultDisplay().getWidth()
				/ title.length;
		for (int i = 0; i < title.length; i++) {
			textView = new TextView(this);
			textView.setText(title[i]);
			textView.setWidth(width);
			textView.setHeight(linerlayout_height - 10);
			textView.setTextSize(20);
			textView.setTextColor(color.black);
			textView.setGravity(Gravity.CENTER);
			textView.setId(i);
			textView.setPadding(5, 5, 5, 5);
			textView.setOnClickListener(this);
			linearLayout.addView(textView);
			arrayList.add(textView);
		}

		pageViews = new ArrayList<View>();
		View view00 = getLocalActivityManager().startActivity("activity01",
				new Intent(this, NullActivity.class)).getDecorView();
		View view01 = getLocalActivityManager().startActivity("activity01",
				new Intent(this, MainActivity1.class)).getDecorView();
		View view02 = getLocalActivityManager().startActivity("activity02",
				new Intent(this, MainActivity2.class)).getDecorView();
		View view03 = getLocalActivityManager().startActivity("activity02",
				new Intent(this, MainActivity3.class)).getDecorView();
		View view04 = getLocalActivityManager().startActivity("activity01",
				new Intent(this, NullActivity.class)).getDecorView();
		pageViews.add(view00);
		pageViews.add(view01);
		pageViews.add(view02);
		pageViews.add(view03);
		pageViews.add(view04);
	}

	void Init_Point() {
		imageViews = new ArrayList<ImageView>();
		ImageView imageView;
		for (int i = 0; i < pageViews.size(); i++) {
			imageView = new ImageView(this);
			imageView.setLayoutParams(new LayoutParams(5, 5));
			imageView.setBackgroundResource(R.drawable.d1);
			LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
					new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
							LayoutParams.WRAP_CONTENT));
			layoutParams.leftMargin = 20;
			layoutParams.rightMargin = 20;
			layout2.addView(imageView, layoutParams);
			// 第一个和最后一个让她消失
			if (i == 0 || i == pageViews.size() - 1) {
				imageView.setVisibility(View.GONE);
			}
			if (i == 1) {
				imageView.setBackgroundResource(R.drawable.d2);
			}
			imageViews.add(imageView);

		}
	}

	public void draw_Point(int index) {
		for (int i = 1; i < imageViews.size(); i++) {

			if (index == i) {
				imageViews.get(i).setBackgroundResource(R.drawable.d2);
			} else
				imageViews.get(i).setBackgroundResource(R.drawable.d1);

		}

	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setTitle("jjhappyforever...");
		setContentView(R.layout.main);
		pager = (ViewPager) findViewById(R.id.vp_contains);
		layout2 = (LinearLayout) findViewById(R.id.iv_image);
		linearLayout = (LinearLayout) findViewById(R.id.mian);
		// 创建linerlayout的大小
		LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
				new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
						LayoutParams.FILL_PARENT));
		layoutParams.height = linerlayout_height;
		linearLayout.setLayoutParams(layoutParams);

		Init();
		Init_Point();
		pager.setAdapter(new myPagerView());

		arrayList.get(0).setBackgroundResource(
				R.drawable.renren_sdk_pay_repair_btn_down);
		pager.setCurrentItem(1);

		pager.setOnPageChangeListener(new OnPageChangeListener() {
			@Override
			public void onPageSelected(int arg0) {
				draw_Point(arg0);// 描绘分页点,一定要写在这里.

				// Toast.makeText(MainActivity.this, ""+arg0, 1000).show();
				// 如果是第一屏或者是最后一屏禁止滑动,其实这里实现的是如果滑动的是第一屏则跳转至第二屏,如果是最后一屏则跳转到倒数第二屏.
				if (arg0 == imageViews.size() - 1 || arg0 == 0) {
					if (arg0 == 0) {
						pager.setCurrentItem(arg0 + 1);// 第二屏 会再次实现该回调方法实现跳转.
						imageViews.get(1).setBackgroundResource(R.drawable.d2);
					} else {
						pager.setCurrentItem(arg0 - 1);// 倒数第二屏
						imageViews.get(arg0 - 1).setBackgroundResource(
								R.drawable.d2);
					}
				} else {
					//一定要卸载else里面,viewpager挺变态的,写在外面,(在你在最左边往左拉的时候会执行两次,最右边也是.)
					setBackgroud(arg0 - 1);
					Toast.makeText(MainActivity.this, "" + arg0, 1000).show();
				}
			}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {

			}

			@Override
			public void onPageScrollStateChanged(int arg0) {

			}
		});
	}
    /***
     * 对title 选项卡处理
     * @param index
     */
	public void setBackgroud(int index) {
		for (int i = 0; i < arrayList.size(); i++) {
			
			arrayList.get(i).setBackgroundDrawable(new BitmapDrawable());

			if (i == index)
				arrayList.get(index).setBackgroundResource(
						R.drawable.renren_sdk_pay_repair_btn_down);
		}

	}
    /***
     * viewpager 的数据源
     * @author zhangjia
     *
     */
	class myPagerView extends PagerAdapter {
		// 显示数目
		@Override
		public int getCount() {
			return pageViews.size();
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0 == arg1;
		}

		@Override
		public int getItemPosition(Object object) {
			// TODO Auto-generated method stub
			return super.getItemPosition(object);
		}

		@Override
		public void destroyItem(View arg0, int arg1, Object arg2) {
			// TODO Auto-generated method stub
			((ViewPager) arg0).removeView(pageViews.get(arg1));
		}

		/***
		 * 获取每一个item, 类于listview中的getview
		 */
		@Override
		public Object instantiateItem(View arg0, int arg1) {
			((ViewPager) arg0).addView(pageViews.get(arg1));
			return pageViews.get(arg1);
		}

	}
    /***
     * 点击事件
     */
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case 0:
			setBackgroud(0);
			pager.setCurrentItem(1);
			break;
		case 1:
			setBackgroud(1);
			pager.setCurrentItem(2);
			break;
		case 2:
			setBackgroud(2);
			pager.setCurrentItem(3);
			break;

		default:
			break;
		}
	}
}
上面就是所有的代码,其实看起来有点小多,不过都挺容易理解的.还有就是前面我写过一片关于viewpager的介绍,这里也就不过多讲解了.详细请下载源码看吧.

样本示例:

第一屏左垃 第一屏 滑向第二屏


第二屏 第三屏 第三屏右拉(会缩回)

源码下载




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以通过以下两种方法禁止ViewPager滑动: 1. 自定义ViewPager类,重写onTouchEvent方法,不处理触摸事件即可。 2. 使用ViewPager的setOnTouchListener方法,监听触摸事件,当触摸事件发生时,返回true,即可禁止ViewPager滑动。 具体实现方法可以参考以下代码: 1. 自定义ViewPager类: ``` public class NoScrollViewPager extends ViewPager { public NoScrollViewPager(Context context) { super(context); } public NoScrollViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent ev) { return false; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return false; } } ``` 2. 使用setOnTouchListener方法: ``` viewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); ``` ### 回答2: Android中的ViewPager是一个非常流行的View,它提供了一种灵活的方式来切换不同的视图。默认情况下,ViewPager可以通过手势水平滑动来切换视图。然而,在某些情况下,您可能需要禁止用户手动滑动,而只是依靠代码来处理切换视图。 一种方法是使用ViewPager的setEnabled()方法来禁用ViewPager的手势滑动。将setEnabled()方法的参数设置为false即可。但是这种方法还可以让ViewPager仍然可以通过代码来进行切换视图,这可能并不是您想要的。 另一种方法是,您可以通过自定义ViewPager来禁止手势滑动,但仍保持使用代码来实现视图切换。 自定义ViewPager主要涉及两个方面。 第一方面涉及ViewPager的手势控制,默认情况下ViewPager具有手势控制功能,我们需要禁用这些手势控制。我们可以通过重写ViewPager的onInterceptTouchEvent和onTouchEvent方法来实现。在这两个方法中,我们可以判断用户的操作类型,如果是手势滑动,我们就不需要将事件传递给父View或子View,以此来禁用ViewPager的手势滑动。 第二个方面涉及ViewPager的动画效果。为了保证视图的切换效果,ViewPager默认添加了一些动画效果。而我们禁用了手势滑动后,这些动画效果可能会变得不协调或不适合我们的需求。因此,我们需要重写ViewPager的onPageScrolled方法来取消动画效果。 通过以上两个操作,我们就可以实现自定义ViewPager,并禁用手势滑动。但是需要注意的是,这样可能会影响用户的交互体验,因此在开发中需要根据具体情况慎重考虑是否要禁用手势滑动。 ### 回答3: 在 Android 中,如果想要禁止 ViewPager 的滑动,可以通过以下三种方法实现: 1. 自定义 ViewPager 可以自定义一个继承自 ViewPager 的类,重写它的 onTouchEvent() 方法和 onInterceptTouchEvent() 方法,在这两个方法中判断是否禁止滑动,如果禁止了,则不执行父类的 onTouchEvent() 和onInterceptTouchEvent() 方法。示例代码如下: ``` public class NonSwipeableViewPager extends ViewPager { private boolean isSwipeEnabled = false; public NonSwipeableViewPager(@NonNull Context context) { super(context); } public NonSwipeableViewPager(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent ev) { return isSwipeEnabled && super.onTouchEvent(ev); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { return isSwipeEnabled && super.onInterceptTouchEvent(ev); } public void setSwipeEnabled(boolean enabled) { isSwipeEnabled = enabled; } } ``` 2. 给 ViewPager 设置监听器 可以在 Activity 或 Fragment 中给 ViewPager 设置 onPageChangeListener,然后在 onPageScrollStateChanged() 方法中判断是否禁止滑动,如果禁止了,则将其返回到初始位置。示例如下: ``` viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_IDLE) { int currentItem = viewPager.getCurrentItem(); if (currentItem == 0) { viewPager.setCurrentItem(0, false); } else if (currentItem == viewPager.getAdapter().getCount() - 1) { viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1, false); } } } }); ``` 3. 通过 layout 参数禁止滑动 在 XML 中设置 ViewPager 的 `android:layout_width` 属性为 0dp,可以禁止它的滑动。示例代码如下: ``` <ViewPager android:id="@+id/viewPager" android:layout_width="0dp" android:layout_height="wrap_content" /> ``` 以上是三种禁止 ViewPager 滑动的方法,开发者可以根据实际需求选用合适的方法来实现自己需要的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值