scrollview积累的一点小小技巧,记录起来

慢慢记录,关于scrollview的就丢到这吧!


1.scrollview老是跳到底部,可以用此方法设置到顶部

txtBaseMsg.setFocusable(true);
txtBaseMsg.setFocusableInTouchMode(true);
txtBaseMsg.requestFocus();

txtBaseMsg是scrollview内最顶的一个控件,任何一个顶部子View都可以,主要是让他获得焦点,滚动到顶部

2.解决scrollview嵌套listview冲突,把listview设置成scrollview的样式,改写listview的onMeasure方法即可

        @Override
	public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
				MeasureSpec.AT_MOST);
		super.onMeasure(widthMeasureSpec, expandSpec);
         }
3.解决 scrollview嵌套ViewPager时两个控件触摸的冲突:自定义Viewpager做为子控件,因为在ViewPager的onTouchEvent中我对onDown进行了操作,进行了操作后就无法将touch事件继续往下传给onClick和其内部控件的任何事件,所以自己做了判断,做了个singleTouch来实现点击的事件,此段代码为转载(
原文链接:http://www.eyeandroid.com/thread-17137-1-1.html

view sourceprint?01public class ChildViewPager extends ViewPager{
   /** 触摸时按下的点 **/
   PointF downP = new PointF();
   /** 触摸时当前的点 **/
   PointF curP = new PointF();
   OnSingleTouchListener onSingleTouchListener;
  
   public ChildViewPager(Context context, AttributeSet attrs) {
   super(context, attrs);
   // TODO Auto-generated constructor stub
   }
  
   public ChildViewPager(Context context) {
   super(context);
   // TODO Auto-generated constructor stub
   }
  
   @Override
   public boolean onInterceptTouchEvent(MotionEvent arg0) {
   // TODO Auto-generated method stub
   //当拦截触摸事件到达此位置的时候,返回true,
   //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent
   return true;
   }
  
   @Override
   public boolean onTouchEvent(MotionEvent arg0) {
   // TODO Auto-generated method stub
   //每次进行onTouch事件都记录当前的按下的坐标
   curP.x = arg0.getX();
   curP.y = arg0.getY();
 
   if(arg0.getAction() == MotionEvent.ACTION_DOWN){
   //记录按下时候的坐标
   //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变
   downP.x = arg0.getX();
   downP.y = arg0.getY();
  //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
   getParent().requestDisallowInterceptTouchEvent(true);
   }
  
   if(arg0.getAction() == MotionEvent.ACTION_MOVE){
   //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰
   getParent().requestDisallowInterceptTouchEvent(true);
   }
  
  if(arg0.getAction() == MotionEvent.ACTION_UP){
   //在up时判断是否按下和松手的坐标为一个点
   //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick
   if(downP.x==curP.x && downP.y==curP.y){
   onSingleTouch();
   return true;
   }
   }
  
   return super.onTouchEvent(arg0);
   }
  
   /**
   * 单击
   */
   public void onSingleTouch() {
   if (onSingleTouchListener!= null) {
  
   onSingleTouchListener.onSingleTouch();
   }
   }
  
   /**
   * 创建点击事件接口
   * @author wanpg
   *
   */
   public interface OnSingleTouchListener {
   public void onSingleTouch();
   }
  
   public void setOnSingleTouchListener(OnSingleTouchListener 
onSingleTouchListener) {
   this.onSingleTouchListener = onSingleTouchListener;
   }
  
  }

发布了2 篇原创文章 · 获赞 0 · 访问量 2140

猜你喜欢

转载自blog.csdn.net/u012076883/article/details/38035223