Androidでviewpager,scrollviewのネスト問題
2384 ワード
Google公式では、ScrollView、ViewPagerなど、UIにスクロール可能なコントロールをネストすることは提唱されていませんが、一定の効果を実現するために使わざるを得ない場合もありますが、実際には多くの有名なAppがこのようにしています.以下は私がまとめた2つのネストの状況です.
一.ScrollViewにViewPagerがネストされている場合
このような比較的一般的なのは、一般的にインタフェースの最上部にViewPagerを配置し、画像を表示するためにいくつかの文字の説明があり、以下はリストであり、以前のバージョンの網易ニュースクライアントのようにこのような効果がある.Listがスクロールされると同時にViewPagerもスクロールされ、その場合はScrolViewにViewPagerをネストします.
ScrollViewは垂直スクロールなので、ViewPagerは水平スライドです.ViewPagerでスライドする場合、水平方向のオフセット量が垂直方向のオフセット量よりも大きくない場合、明らかなScrolViewスクロールの問題があり、ユーザー体験に影響します.解決策は2つまとめました.
1.カスタムScrollViewで、dispatchTouchEvent、onInterceptTouchEvent、onTouchEventなどの方法を上書きすることで、TouchEventを人為的に制御します.そこでネットで検索して、クリックしてリンクを開く方法を見つけました.ScrollViewのonInterceptTouchEventメソッドを上書きし、水平方向と垂直方向のオフセット量を計算することで、ScrollViewにTouchEventをブロックするかサブViewに渡すかを決定させる.試してみると、効果的で、コードは以下の通りです.
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
xDistance = yDistance = 0f;
xLast = ev.getX();
yLast = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
final float curX = ev.getX();
final float curY = ev.getY();
xDistance += Math.abs(curX - xLast);
yDistance += Math.abs(curY - yLast);
xLast = curX;
yLast = curY;
if(xDistance > yDistance){
return false;
}
}
return super.onInterceptTouchEvent(ev);
}
2.ViewPagerをカスタマイズし、dispatchTouchEventメソッドを上書きします.この方法は、クリックしてリンクコードを開くと次のようになります.
boolean ret = super.dispatchTouchEvent(ev);
if(ret)
{
requestDisallowInterceptTouchEvent(true);
}
return ret;
retがtrueの場合、親のコントロールと祖先のコントロールがTouchEventをブロックできないように設定します.リクエストは、ViewPagerのすべての親コントロールに渡されます.そしてACTION_からDOWNからACTION_UPプロセス全体.この方法も簡単で、効果もいいと思います.
二.ViewPagerではScrollViewがネストされ、ScrollViewではViewPagerがネストされます.
この場合、ScrollViewでネストされた子ViewPagerをスライドさせた場合、そのViewPagerは切り替えられず、親ViewPagerを切り替えます.この場合、ViewPagerをカスタマイズするしかありません.方法は状況1の2つ目の方法と同じで、効果もいいです.子ViewPagerは、親および祖先コントロールに渡さずにTouchEventを取得します.