scrollview+viewpaver组合时viewpaver高度设置和滑动冲突问题

本文详细介绍了在Android应用中如何解决页面顶部图片轮播控件与下方小图片展示区之间的冲突问题。通过自定义ScrollView和优化图片加载与缩放逻辑,实现了流畅的图片轮播和内容展示功能。同时,讨论了使用流行的ImageLoader加载网络图片,并调整Viewpager高度以适应屏幕布局的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


      项目需求: 页面顶部一个图片轮播控件,下面展示很多其他小图片,这样组合起来做成首页;我这里用scrollview+viewpager实现出现了两个冲突问题;

问题1:在viewpager中左右滑动时很容易触发scrollview的touch事件,导致左右滑动非常难切换图片, 必须保持是水平滑动,不然就会滑动失败!

                 解决办法: 百度到的一个方法, 效果很好, 自定义一个scrollview,重写onInterceptTouchEvent(MotionEvent ev)方法:

public class CustomScrollView extends ScrollView {
	private boolean canScroll;

	private GestureDetector mGestureDetector;

	public CustomScrollView(Context context) {
		super(context);
	}

	public CustomScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);

		isInEditMode();
		mGestureDetector = new GestureDetector(context, new YScrollDetector());
		canScroll = true;
	}

	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		if (ev.getAction() == MotionEvent.ACTION_UP)
			canScroll = true;
		return super.onInterceptTouchEvent(ev)
				&& mGestureDetector.onTouchEvent(ev);
	}

	class YScrollDetector extends SimpleOnGestureListener {
		@Override
		public boolean onScroll(MotionEvent e1, MotionEvent e2,
				float distanceX, float distanceY) {
			if (canScroll)
				if (Math.abs(distanceY) >= Math.abs(distanceX))
					canScroll = true;
				else
					canScroll = false;
			return canScroll;
		}
	}
}
问题2:顶部viewpager在展示图片时 图片宽度没有屏幕大,而需求需要充满横屏,这就需要imageview设置fitXY来填充,但是这样会导致图片拉伸变形,需要添加按比例缩放逻辑,网上搜了好几个方法,都没有达到我要的效果,最后解决方式如下:

/**
	 * 当宽度为填充父类时获取缩放的高度
	 * 
	 * @param act
	 * @param bm
	 * @return
	 */
	public static int getZoomHeight(Activity act, Bitmap bm) {
		int zoomHight = 0;
		Point point = new Point();
		WindowManager manager = act.getWindowManager();
		DisplayMetrics metrics = new DisplayMetrics();
		manager.getDefaultDisplay().getMetrics(metrics);
		manager.getDefaultDisplay().getSize(point);
		BigDecimal PIC_X = new BigDecimal(point.x);
		BigDecimal imageWidth = new BigDecimal(bm.getWidth());
		float widthScall = PIC_X
				.divide(imageWidth, 2, BigDecimal.ROUND_HALF_UP).floatValue();
		float height = bm.getHeight();
		zoomHight = (int) (widthScall * height);
		return zoomHight;
	}
另外,这里使用了流行的ImageLoader加载网络图片,最后设置viewpager高度(如果设置viewpager的高度为填充父类还是包裹内容都会导致viewpager直接看不见 0 0,貌似是viewpager和scrollview的布局冲突,木有找到解决办法):

ImageLoader.getInstance().displayImage(imagePath, mImageView,
					new SimpleImageLoadingListener() {
						@Override
						public void onLoadingComplete(String imageUri,
								View view, Bitmap loadedImage) {
							// TODO Auto-generated method stub
							int scallHeight = AppContext.getScallZoomHeight(
									getActivity(), loadedImage);
							homeADViewPager
									.setLayoutParams(new LinearLayout.LayoutParams(
											LinearLayout.LayoutParams.MATCH_PARENT,
											scallHeight));
							super.onLoadingComplete(imageUri, view, loadedImage);
						}
					});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值