1.ScrollView中嵌套ScrollView并且内部ScrollView也可滑动
(1)ScrollView继承类
public class InnerScrollView extends ScrollView { Handler handler; public ScrollView parentScrollView; public InnerScrollView(Context context, AttributeSet attrs) { super(context, attrs); handler = new Handler(); } private int lastScrollDelta = 0; public void resume() { overScrollBy(0, -lastScrollDelta, 0, getScrollY(), 0, getScrollRange(), 0, 0, true); lastScrollDelta = 0; } int mTop = 10; /** * 将targetView滚到最顶端 */ public void scrollTo(final View targetView) { handler.postDelayed(new Runnable() { @Override public void run() { int oldScrollY = getScrollY(); int top = targetView.getTop() - mTop; final int delatY = top - oldScrollY; lastScrollDelta = delatY; smoothScrollTo(0, top); } }, 50); } private int getScrollRange() { int scrollRange = 0; if (getChildCount() > 0) { View child = getChildAt(0); scrollRange = Math.max(0, child.getHeight() - (getHeight())); } return scrollRange; } int currentY; @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (parentScrollView == null) { return super.onInterceptTouchEvent(ev); } else { if (ev.getAction() == MotionEvent.ACTION_DOWN) { // 将父scrollview的滚动事件拦截 currentY = (int)ev.getY(); setParentScrollAble(false); return super.onInterceptTouchEvent(ev); } else if (ev.getAction() == MotionEvent.ACTION_UP) { // 把滚动事件恢复给父Scrollview setParentScrollAble(true); } else if (ev.getAction() == MotionEvent.ACTION_MOVE) { } } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { View child = getChildAt(0); if (parentScrollView != null) { if (ev.getAction() == MotionEvent.ACTION_MOVE) { int height = child.getMeasuredHeight(); height = height - getMeasuredHeight(); // System.out.println("height=" + height); int scrollY = getScrollY(); // System.out.println("scrollY" + scrollY); int y = (int)ev.getY(); // 手指向下滑动 if (currentY < y) { if (scrollY <= 0) { // 如果向下滑动到头,就把滚动交给父Scrollview setParentScrollAble(true); return false; } else { setParentScrollAble(false); } } else if (currentY > y) { if (scrollY >= height) { // 如果向上滑动到头,就把滚动交给父Scrollview setParentScrollAble(true); return false; } else { setParentScrollAble(false); } } currentY = y; } } return super.onTouchEvent(ev); } /** * 是否把滚动事件交给父scrollview * * @param flag */ private void setParentScrollAble(boolean flag) { parentScrollView.requestDisallowInterceptTouchEvent(!flag); } }
(2)ScrollView使用Activity
public class ScrollViewActivity extends Activity { ScrollView scrollView1; InnerScrollView innerScrollView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); scrollView1 = (ScrollView)findViewById(R.id.scroll_1); innerScrollView = (InnerScrollView)findViewById(R.id.scroll_2); innerScrollView.parentScrollView = scrollView1; final Button button = (Button)innerScrollView.findViewById(R.id.scroll_button2); final View content = findViewById(R.id.scroll_content); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (content.getVisibility() == View.VISIBLE) { innerScrollView.resume(); content.setVisibility(View.GONE); } else { innerScrollView.scrollTo(v); content.setVisibility(View.VISIBLE); } } }); } }
2.ScrollView中嵌套ListView并且内部ListView也可滑动
(1)ScrollView继承类
public class InnerListView extends ListView { ScrollView parentScrollView; public ScrollView getParentScrollView() { return parentScrollView; } public void setParentScrollView(ScrollView parentScrollView) { this.parentScrollView = parentScrollView; } private int maxHeight; public int getMaxHeight() { return maxHeight; } public void setMaxHeight(int maxHeight) { this.maxHeight = maxHeight; } public InnerListView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub if (maxHeight > -1) { heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); System.out.println(getChildAt(0)); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: setParentScrollAble(false); case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: setParentScrollAble(true); break; default: break; } return super.onInterceptTouchEvent(ev); } /** * @param flag */ private void setParentScrollAble(boolean flag) { parentScrollView.requestDisallowInterceptTouchEvent(!flag); } }
(2)ScrollView实用Activity
public class ListViewActivity extends Activity { ScrollView scrollView; InnerListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list_view_test); listView = (InnerListView)findViewById(R.id.list); scrollView = (ScrollView)findViewById(R.id.scroll_view); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.select_dialog_singlechoice); for (int i = 0; i < 100; i++) { adapter.add(String.valueOf(i)); } listView.setAdapter(adapter); listView.setCacheColorHint(0x00000000); listView.setBackgroundDrawable(null); listView.setBackgroundColor(Color.WHITE); listView.setParentScrollView(scrollView); listView.setMaxHeight(400); } }
源码地址:http://download.csdn.net/detail/pcaxb/8981295
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-15 05:24:24