项目需求: 页面顶部一个图片轮播控件,下面展示很多其他小图片,这样组合起来做成首页;我这里用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);
}
});