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
- scroller 广告轮播 手指滑动 +viewpager 广告轮播 手指滑动
- jQuery手指滑动轮播
- 移动端手指滑动实现轮播效果
- BannerViewpager 实现广告轮播(定时轮播+手势滑动)
- ANDROID广告轮播DEMO_仿淘宝广告轮播_滑动图片广告例子
- ViewPager自动轮播,手指按住停止轮播
- ViewPager实现广告轮播
- ViewPager实现广告轮播
- ViewPager实现广告轮播
- ViewPager实例 广告轮播
- ViewPager实现广告轮播
- Android ViewPager广告轮播
- 关于ViewPager广告轮播推送中“如何处理自动滑动和用户滑动事件”的解决方案
- 手机webApp触摸左右滑动切换轮播图片广告
- 滑动文本标签,一个类解决广告轮播 UIScrollView
- ViewPager (上)-- 广告 自动 轮播
- Android ViewPager实现广告无限轮播
- ViewPager实现广告轮播效果
- Java源码-一个简单的分词器(Tokenizing Telephone Numbers)
- 如何使用git
- canvas
- runtime理解
- hdu2112 HDU Today(dijkstra求单源最短路)
- scroller 广告轮播 手指滑动 +viewpager 广告轮播 手指滑动
- 软件测试之因果图
- 日志的使用Log4j
- php GD2 --1
- 多媒体播放盒 电视 安卓 规范测试 点检表
- uva167 The Sultan's Successors
- 跟Sam大叔学JS(二) -----不同页面实现数据传递
- 内存(数组)流
- 使用SQL语句建立特殊需求的序列号