scroller 广告轮播 手指滑动 +viewpager 广告轮播 手指滑动

来源:互联网 发布:php个人简历源代码 编辑:程序博客网 时间:2024/04/30 18:27
package imooc.com.androidheroes.lnewfeatures.toolbartest;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.VelocityTracker;import android.view.View;import android.view.ViewGroup;import android.widget.Scroller;import java.util.Timer;import java.util.TimerTask;public class HorizontalScrollViewEx extends ViewGroup {    private static final String TAG = "HorizontalScrollViewEx";    private int mChildrenSize;    private int mChildWidth;    private int mChildIndex;    // 分别记录上次滑动的坐标    private int mLastX = 0;    private int mLastY = 0;    // 分别记录上次滑动的坐标(onInterceptTouchEvent)    private int mLastXIntercept = 0;    private int mLastYIntercept = 0;    private Scroller mScroller;    private VelocityTracker mVelocityTracker;    public HorizontalScrollViewEx(Context context) {        super(context);        init();    }    public HorizontalScrollViewEx(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    public HorizontalScrollViewEx(Context context, AttributeSet attrs,            int defStyle) {        super(context, attrs, defStyle);        init();    }    private void init() {        if (mScroller == null) {            mScroller = new Scroller(getContext());            mVelocityTracker = VelocityTracker.obtain();        }    }    @Override    public boolean onInterceptTouchEvent(MotionEvent event) {        boolean intercepted = false;        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN: {            intercepted = false;            if (!mScroller.isFinished()) {                mScroller.abortAnimation();                intercepted = true;            }            break;        }        case MotionEvent.ACTION_MOVE: {            int deltaX = x - mLastXIntercept;            int deltaY = y - mLastYIntercept;            if (Math.abs(deltaX) > Math.abs(deltaY)) {                intercepted = true;            } else {                intercepted = false;            }            break;        }        case MotionEvent.ACTION_UP: {            intercepted = false;            break;        }        default:            break;        }        Log.d(TAG, "intercepted=" + intercepted);        mLastX = x;        mLastY = y;        mLastXIntercept = x;        mLastYIntercept = y;        return intercepted;    }    @Override    public boolean onTouchEvent(MotionEvent event) {        mVelocityTracker.addMovement(event);        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.getAction()) {        case MotionEvent.ACTION_DOWN: {            if (!mScroller.isFinished()) {                mScroller.abortAnimation();            }            getParent().requestDisallowInterceptTouchEvent(true);            isTouch = true;            break;        }        case MotionEvent.ACTION_MOVE: {            int deltaX = x - mLastX;            int deltaY = y - mLastY;            ///////////////////2////////            int cc=mChildrenSize-2;            if(mChildIndex==0){                scrollTo(cc*getWidth(), 0);                mChildIndex=cc;            }else  if(mChildIndex==cc+1){                scrollTo(getWidth(), 0);                mChildIndex=1;            }             scrollBy(-deltaX, 0);            getParent().requestDisallowInterceptTouchEvent(true);            isTouch = true;            break;        }        case  MotionEvent.ACTION_CANCEL: {            getParent().requestDisallowInterceptTouchEvent(false);            break;        }        case MotionEvent.ACTION_UP: {            int scrollX = getScrollX();            mVelocityTracker.computeCurrentVelocity(1000);            float xVelocity = mVelocityTracker.getXVelocity();            if (Math.abs(xVelocity) >= 50) {                mChildIndex = xVelocity > 0 ? mChildIndex - 1 : mChildIndex + 1;            } else {                mChildIndex = (scrollX + mChildWidth / 2) / mChildWidth;//0--> mChildrenSize            }          mChildIndex = Math.max(0, Math.min(mChildIndex, mChildrenSize - 1));//0-->mChildrenSize-1            int dx = mChildIndex * mChildWidth - scrollX;            smoothScrollBy(dx, 0);            mVelocityTracker.clear();            isTouch = false;            break;        }        default:            break;        }        mLastX = x;        mLastY = y;        return true;    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        int measuredWidth = 0;        int measuredHeight = 0;        final int childCount = getChildCount();        measureChildren(widthMeasureSpec, heightMeasureSpec);        int widthSpaceSize = MeasureSpec.getSize(widthMeasureSpec);        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);        int heightSpaceSize = MeasureSpec.getSize(heightMeasureSpec);        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);        if (childCount == 0) {            setMeasuredDimension(0, 0);        } else if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) {            final View childView = getChildAt(0);            measuredWidth = childView.getMeasuredWidth() * childCount;            measuredHeight = childView.getMeasuredHeight();            setMeasuredDimension(measuredWidth, measuredHeight);        } else if (heightSpecMode == MeasureSpec.AT_MOST) {            final View childView = getChildAt(0);            measuredHeight = childView.getMeasuredHeight();            setMeasuredDimension(widthSpaceSize, childView.getMeasuredHeight());        } else if (widthSpecMode == MeasureSpec.AT_MOST) {            final View childView = getChildAt(0);            measuredWidth = childView.getMeasuredWidth() * childCount;            setMeasuredDimension(measuredWidth, heightSpaceSize);        }        /////////////////////1/////////////////        scrollTo(getWidth(), 0);        mChildIndex=1;        stateChange.drawCicle(4,                    0 % 4);        startScroll();    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        int childLeft = 0;        final int childCount = getChildCount();        mChildrenSize = childCount;        for (int i = 0; i < childCount; i++) {            final View childView = getChildAt(i);            if (childView.getVisibility() != View.GONE) {                final int childWidth = childView.getMeasuredWidth();                mChildWidth = childWidth;                childView.layout(childLeft, 0, childLeft + childWidth,                        childView.getMeasuredHeight());                childLeft += childWidth;            }        }    }    private void smoothScrollBy(int dx, int dy) {        if (stateChange != null) {            int index=mChildIndex;            if (mChildIndex==0){                index=4;            }            else if(mChildIndex==5){                index=1;            }            index=index-1;            stateChange.drawCicle(4,                    index % 4);        }        mScroller.startScroll(getScrollX(), 0, dx, 0, 500);        invalidate();    }    @Override    public void computeScroll() {        if (mScroller.computeScrollOffset()) {            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());            postInvalidate();        }    }    @Override    protected void onDetachedFromWindow() {        mVelocityTracker.recycle();        stopScroll();        super.onDetachedFromWindow();    }    private boolean isTouch = false;    /**     * 定时器     */    private Timer time;    boolean isScroll = false;    public void startScroll() {        if (isScroll||!mScroller.isFinished())            return;        if (time == null)            time = new Timer();        time.schedule(new TimerTask() {            @Override            public void run() {                isScroll = true;                Runnable run = new Runnable() {                    @Override                    public void run() {                        // TODO Auto-generated method stub                        if (isTouch) {                        } else {                            if(mScroller.isFinished()){                                int cc=mChildrenSize-2;                                if(mChildIndex==0){                                    scrollTo(cc*getWidth(), 0);                                    mChildIndex=cc;                                }else  if(mChildIndex==cc+1){                                    scrollTo(getWidth(), 0);                                    mChildIndex=1;                                }                                int scrollX = getScrollX();                                mChildIndex++;                                mChildIndex = Math.max(0, Math.min(mChildIndex, mChildrenSize - 1));//0-->mChildrenSize-1                                int dx = mChildIndex * mChildWidth - scrollX;                                smoothScrollBy(dx, 0);                            }                        }                    }                };                post(run);            }        }, 500, 2000);    }    public void stopScroll() {        if (time != null) {            time.cancel();            time = null;        }    }    private AutoScrollViewPagerStateChange stateChange;    public void setStateChange( AutoScrollViewPagerStateChange stateChange) {        this.stateChange=stateChange;    }}
package imooc.com.androidheroes.lnewfeatures.toolbartest; import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Rect;import android.util.AttributeSet;import android.view.View;/** * viewpager ײ��±ָʾ�� * @author ML  2015-05-29 * */public class AutoScrollViewPagerStateChange extends View {   public AutoScrollViewPagerStateChange(Context context, AttributeSet attrs) {      super(context, attrs);      // TODO Auto-generated constructor stub   }   private int size, current;   @SuppressLint("NewApi")   @Override   protected void onDraw(Canvas canvas) {      // TODO Auto-generated method stub      super.onDraw(canvas);      Paint p = new Paint();      p.setAntiAlias(true);      p.setAlpha(1);      int item_width = 30;      int item_height=5;      int jiange=20;      int center_x = (getWidth() - item_width * size-jiange*(size)) / 2;        int lastright = 0;      for (int i = 0; i < size; i++) {         p.setColor(Color.parseColor("#ff00ff"));         p.setStyle(Style.FILL);         if (i == current) {            p.setStyle(Style.FILL);            p.setColor(Color.WHITE);         }         /*canvas.drawCircle(center_x + item_width / 2 + i * item_width,               getHeight() / 2, 10, p);*/         int left=center_x + item_width / 2 + i * item_width;         if(i!=0)left=lastright+jiange;                  int right=left+item_width;              lastright=right;         int top=0;         int bottom=item_height;         Rect r=new Rect(left,top,right,bottom);         canvas.drawRect(r, p);                              }      canvas.save();   }   public void drawCicle(int size, int current) {      this.size = size;      this.current = current;      invalidate();   }}
package imooc.com.androidheroes.lnewfeatures.toolbartest;import java.util.ArrayList;import java.util.Timer;import java.util.TimerTask; import android.app.Activity;import android.content.Context;import android.graphics.PointF;import android.graphics.drawable.Drawable;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.ImageView.ScaleType;import imooc.com.androidheroes.R;//public class AutoScrollViewPager extends ViewPager {   /** ������µ���� **/   PointF downP = new PointF();   /** ��ǰ���µ���� **/   PointF curP = new PointF();   OnSingleTouchListener onSingleTouchListener;   public MyPagerAdapter adapter;   public ArrayList<View> listViews;   private Activity acitvity;   private boolean isTouch = false;   AutoScrollViewPager viewpager;   AutoScrollViewPagerStateChange stateChange;   public AutoScrollViewPager(Context context, AttributeSet attrs) {      super(context, attrs);      listViews = new ArrayList<View>();      viewpager = this;      adapter = new MyPagerAdapter();      viewpager.setAdapter(adapter);      initOntouch();   }   public AutoScrollViewPagerStateChange getStateChange() {      return stateChange;   }   public void setStateChange(AutoScrollViewPagerStateChange stateChange) {      this.stateChange = stateChange;   }   public void setAcitvity(Activity acitvity) {      this.acitvity = acitvity;   }   public void setListinfo() {      listViews = new ArrayList<View>();      int image[] = { R.drawable.test1, R.drawable.test2,            R.drawable.test3, R.drawable.test4 };      if (acitvity == null)         new Exception("activity  should not be null");      for (int i = 0; i < image.length; i++) {         ImageView img = new ImageView(acitvity);         Drawable draw = acitvity.getResources().getDrawable(image[i]);         img.setScaleType(ScaleType.FIT_XY);         img.setImageDrawable(draw);         listViews.add(img);      }      setChangeState();   }   private void setChangeState() {      viewpager.setOnPageChangeListener(new OnPageChangeListener() {         @Override         public void onPageSelected(int arg0) {            // TODO Auto-generated method stub            if (stateChange != null)               stateChange.drawCicle(listViews.size(),                     arg0 % listViews.size());         }         @Override         public void onPageScrolled(int arg0, float arg1, int arg2) {            // TODO Auto-generated method stub         }         @Override         public void onPageScrollStateChanged(int arg0) {            // TODO Auto-generated method stub         }      });      adapter.notifyDataSetChanged();      viewpager.setCurrentItem(0);   }   public void setListViews(ArrayList<View> listViews2) {      this.listViews = listViews2;      adapter.notifyDataSetChanged();   }   private void initOntouch() {      // TODO Auto-generated method stub      viewpager.setOnTouchListener(new OnTouchListener() {         @Override         public boolean onTouch(View arg1, MotionEvent arg0) {            // TODO Auto-generated method stub            // ��ǰ��긳ֵ            curP.x = arg0.getX();            curP.y = arg0.getY();            if (arg0.getAction() == MotionEvent.ACTION_DOWN) {               //               // ��ǰ���¸ֵ               downP.x = arg0.getX();               downP.y = arg0.getY();               // ���� ��ȡ��ǰ¼���֪ͨ���ؼ������¼��ڽ��зַ               getParent().requestDisallowInterceptTouchEvent(true);               isTouch = true;            }            if (arg0.getAction() == MotionEvent.ACTION_MOVE) {               //               getParent().requestDisallowInterceptTouchEvent(true);               isTouch = true;            }            if (arg0.getAction() == MotionEvent.ACTION_UP) {               //               //               if (downP.x == curP.x && downP.y == curP.y) {                  onSingleTouch(viewpager.getCurrentItem()                        % listViews.size());               }               isTouch = false;            } else if (arg0.getAction() == MotionEvent.ACTION_CANCEL) {               getParent().requestDisallowInterceptTouchEvent(false);            }            return false;         }      });   }   public AutoScrollViewPager(Context context) {      super(context);      // TODO Auto-generated constructor stub   }   /*    * @Override public boolean onInterceptTouchEvent(MotionEvent arg0) { //    * TODO Auto-generated method stub // ��ǰ¼����ٽ��зַ    *     * return true; }    */   /**    * �����¼    */   public void onSingleTouch(Object obj) {      if (onSingleTouchListener != null) {         onSingleTouchListener.onSingleTouch(obj);      }   }   /**    * �����¼��ӿ    */   public interface OnSingleTouchListener {      public void onSingleTouch(Object obj);   }   public void setOnSingleTouchListener(         OnSingleTouchListener onSingleTouchListener) {      this.onSingleTouchListener = onSingleTouchListener;   }   /**    * ��ʱ��    */   private Timer time;   boolean isScroll = false;   public void startScroll() {      if (isScroll)         return;      if (time == null)         time = new Timer();      time.schedule(new TimerTask() {         @Override         public void run() {            isScroll = true;            Runnable run = new Runnable() {               @Override               public void run() {                  // TODO Auto-generated method stub                  if (isTouch) {                  } else {                     int current = viewpager.getCurrentItem();                     if (current < adapter.getCount() - 1) {                        viewpager.setCurrentItem(current + 1);                     } else {                        viewpager.setCurrentItem(0);                     }                  }               }            };            viewpager.post(run);         }      }, 500, 2000);   }   public void stopScroll() {      if (time != null) {         time.cancel();         time = null;      }   }   // viewpager�� adapter   private class MyPagerAdapter extends PagerAdapter {      @Override      public int getCount() {         // TODO Auto-generated method stub         // return listViews.size();         return Integer.MAX_VALUE;      }      @Override      public boolean isViewFromObject(View arg0, Object arg1) {         // TODO Auto-generated method stub         return arg0 == arg1;      }      public void destroyItem(ViewGroup container, int position, Object object) {         container.removeView(listViews.get(position % listViews.size()));// ɾ���ϸͼƬ      }      public Object instantiateItem(ViewGroup container, int position) {         container.addView(listViews.get(position % listViews.size()), 0);//         return listViews.get(position % listViews.size());      }   }}

<RelativeLayout    android:layout_width="match_parent"    android:layout_height="100dp">    <imooc.com.androidheroes.lnewfeatures.toolbartest.HorizontalScrollViewEx        android:id="@+id/hsve"        android:layout_width="match_parent"        android:layout_height="match_parent">        <ImageView            android:layout_width="fill_parent"            android:layout_height="match_parent"            android:scaleType="fitXY"            android:src="@drawable/test4"/>        <ImageView            android:layout_width="fill_parent"            android:layout_height="match_parent"            android:scaleType="fitXY"            android:src="@drawable/test1"/>        <ImageView            android:layout_width="fill_parent"            android:layout_height="match_parent"            android:scaleType="fitXY"            android:src="@drawable/test2"/>        <ImageView            android:layout_width="fill_parent"            android:layout_height="match_parent"            android:scaleType="fitXY"            android:src="@drawable/test3"/>        <ImageView            android:layout_width="fill_parent"            android:layout_height="match_parent"            android:scaleType="fitXY"            android:src="@drawable/test4"/>        <ImageView            android:layout_width="fill_parent"            android:layout_height="match_parent"            android:scaleType="fitXY"            android:src="@drawable/test1"/>    </imooc.com.androidheroes.lnewfeatures.toolbartest.HorizontalScrollViewEx>    <imooc.com.androidheroes.lnewfeatures.toolbartest.AutoScrollViewPagerStateChange        android:layout_height="10dp"        android:layout_width="match_parent"        android:layout_alignParentBottom="true"        android:id="@+id/viewpagerstate"        /></RelativeLayout><RelativeLayout    android:layout_width="match_parent"    android:layout_height="100dp">    <imooc.com.androidheroes.lnewfeatures.toolbartest.AutoScrollViewPager        android:id="@+id/viewpager"        android:layout_width="match_parent"        android:layout_height="match_parent"/>    <imooc.com.androidheroes.lnewfeatures.toolbartest.AutoScrollViewPagerStateChange        android:layout_height="10dp"        android:layout_width="match_parent"        android:layout_alignParentBottom="true"        android:id="@+id/viewpagerstate2"        />

setContentView(R.layout.activity_customview_test);AutoScrollViewPagerStateChange state = (AutoScrollViewPagerStateChange) this.findViewById(R.id.viewpagerstate);HorizontalScrollViewEx hsve= (HorizontalScrollViewEx) findViewById(R.id.hsve);hsve.setStateChange(state);AutoScrollViewPager viewpager = (AutoScrollViewPager)this.findViewById(R.id.viewpager);viewpager.setOnSingleTouchListener(new AutoScrollViewPager.OnSingleTouchListener() {    @Override    public void onSingleTouch(Object obj) {        // TODO Auto-generated method stub       /* String in=obj.toString();        Toast.makeText(getBaseContext(), ""+ in, Toast.LENGTH_SHORT).show();*/    }});viewpager.setAcitvity(this);viewpager.setListinfo();AutoScrollViewPagerStateChange state2 = (AutoScrollViewPagerStateChange) this.findViewById(R.id.viewpagerstate2);viewpager.setStateChange(state2);


0 0
原创粉丝点击