标签:
onTouch事件传递机制。  Lisenter监听  ImageView的src background scaleType不同属性的显示情况。  onTouch滑动抬起调用的MotionEvent.ACTION_CANCEL不是MotionEvent.ACTION_UP ① 创建Activity Layout 
② 继承ViewPager 创建AutoScrollViewPager 
③ 显示点 
④ 添加监听OnPageChangedListener 
⑤ 自动滚动 
⑥ 手动滚动时 停止滚动 
public class AutoScrollViewPager extends ViewPager {
 // .xml
 public AutoScrollViewPager(Context context, AttributeSet attrs) {
 super(context, attrs);
}
<com.itheima.autoscroll.view.AutoScrollViewPager
android:id="@+id/sroll_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#47659E" />
// 选择器:selector 管理素材的对象 根据 不同的状态显示不同的图片 press
 // select=true false
 // view.setSlected()
 private List<ImageView> dots = new ArrayList<ImageView>();
 public void init(int pageNumber, LinearLayout layoutDot) {
 // 3
pageCount = pageNumber;
 // .xml
 // .java
 for (int i = 0; i < pageNumber; i++) {
ImageView img = new ImageView(getContext());
img.setBackgroundResource(R.drawable.dot_selector);
img.setSelected(false);// 红
 // .xml layout_width layout_height
 // .java LinearLayout.LayoutParams 布局参数
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(//
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
 // .xml marginRight
 // .java rightMargin
p.rightMargin = 6;
layoutDot.addView(img, p);
dots.add(img);
}
dots.get(0).setSelected(true);
 // 设置内容
PagerAdapter adpater = new ImageViewAdapter();
 this.setAdapter(adpater);// PageAdpater FragmentPageAdapter
 // ④ 添加监听OnPageChangedListener
 // ⑤ 自动滚动保持点的同步
 // ⑥ 手动滚动时 停止滚动
OnPageChangeListener listener = new MyOnPageChangeListener();
 this.setOnPageChangeListener(listener);// OnPageChangeListener监听滑动到第几页
}
同步通过ViewPage 选中状态来控制页面的标题和圆点的同步
private class MyOnPageChangeListener implements OnPageChangeListener {
 @Override
 public void onPageScrollStateChanged(int arg0) {
}
 @Override
 public void onPageScrolled(int arg0, float arg1, int arg2) {
}
 // 滑动第几页面
 @Override
 public void onPageSelected(int arg0) {
 // 3
 // 0 1 2 3 4 5
 // 取余操作
 // 0 1 2 ->0 1 2
 // 旧点不亮
 if (isLooping) {
dots.get(currPageIndex % pageCount).setSelected(false);
 // 新点高亮
currPageIndex = arg0;
dots.get(currPageIndex % pageCount).setSelected(true);
} else {
dots.get(currPageIndex).setSelected(false);
 // 新点高亮
currPageIndex = arg0;
dots.get(currPageIndex).setSelected(true);
}
}
}
private int currPageIndex = 0;
 private class ImageViewAdapter extends PagerAdapter {
 // 页数
 @Override
 public int getCount() {
 if (isLooping) {
 return Integer.MAX_VALUE;
} else {
 return pageCount;
}
}
 @Override
 public boolean isViewFromObject(View arg0, Object arg1) {
 return arg0 == arg1;
}
 // 当前显示视图
 @Override
 public Object instantiateItem(ViewGroup container, int position) {
 // 创建显示的页面 是一张图片
ImageView imag = new ImageView(getContext());
imag.setBackgroundResource(R.drawable.home_scroll_default);
 // .xml layout_width layout_height
 // .java ViewPager.LayoutParams
ViewPager.LayoutParams p = new ViewPager.LayoutParams();
p.width = ViewPager.LayoutParams.MATCH_PARENT;
p.height = ViewPager.LayoutParams.MATCH_PARENT;
container.addView(imag, p);
 return imag;
}
 // 移除显示
 @Override
 public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((ImageView) object);
}
}
原理: 通过Handle发送延时消息。类似递归的实现
2.4.自动滚动
// 支持无限滑动
 private boolean isLooping = false;
 public void setLooping(boolean flag) {
isLooping = flag;
}
 private Handler handler = new Handler() {
 // 回调函数: 1.重写 2.系统或其它对象调用
 // on
 public void handleMessage(android.os.Message msg) {
 if (msg.what == 1) {
Log.i("wzx", "切换到下一页");
 // 切换到下一页
 int curr = getCurrentItem();
++curr;
setCurrentItem(curr);// 显示指定页面
 // 重写给自己发一个消息
 // Message msg=new Message();
Message msg2 = handler.obtainMessage();// obtain=get 是一种优化写法
 // 内部查找可重用的Message 如果有就重用 没有呢 才创建新的。
msg2.what = 1;
handler.sendMessageDelayed(msg2, 3000);// ---->handleMessage
 // 循环发送息
}
};
};
 // 支持自动播放
 // 暴露给外面调用。
 public void startScroll() {
 // 3000
 // Message msg=new Message();
Message msg = handler.obtainMessage();// obtain=get 是一种优化写法
 // 内部查找可重用的Message 如果有就重用 没有呢 才创建新的。
msg.what = 1;
handler.sendMessageDelayed(msg, 3000);// ---->handleMessage
}
 /**
* 停止播放
*/
 public void stopScroll() {
 // 清除所有消息 handleMessage就不能执行
 // 使用回调函数没有条件满足
handler.removeCallbacksAndMessages(null);//
}
 OnTouchListener listener = new MyOnTouchListener();
imag.setOnTouchListener(listener);
 private class MyOnTouchListener implements OnTouchListener {
 private int downX = 0;
 private long downTime = 0;
 // MotionEvent 归属地位置改变 小火箭
 @Override
 public boolean onTouch(View v, MotionEvent event) {
 switch (event.getAction()) {// 获取动作
 case MotionEvent.ACTION_DOWN:// 按下
stopScroll();
downX = (int) event.getX();// 获取按下位
downTime = System.currentTimeMillis();// 保存按下时间
Log.i("wzx", "ACTION_DOWN");
 break;
 case MotionEvent.ACTION_MOVE:// 移动
Log.i("wzx", "ACTION_MOVE");
 break;
 case MotionEvent.ACTION_UP:// 提起
Log.i("wzx", "ACTION_UP");
 int upX = (int) event.getX();
 if (downX == upX && System.currentTimeMillis() - downTime < 300) {
 //使用Command设计模式 可以增加一个接口作监听器 
 //1.创建interface 
 //2.抽象方法 (抽取代码 去掉方法体)
 //3.添加监听器
 //4.监听器是要被调用。
 //让开发者把代码写监听器里(控件外边)
// onItemClick();
 if(listener!=null)
{
listener.onItemClick();//方法内部的代码
}
}
startScroll();
 break;
 case MotionEvent.ACTION_CANCEL:// 取消
Log.i("wzx", "ACTION_CANCEL");
startScroll();
 break;
}
 return true;// 返回值 处理这个事件就返回true
}
}
Command设计模式原理:
 private OnViewClickListener listener ;
 public interface OnViewClickListener 
 {
 public void onViewClick();
}
 public void setOnViewClickListener(OnViewClickListener listener)
 {
 this.listener = listener;
}
ACTION_UP调用回调方法  case MotionEvent.ACTION_UP:
startScroll();
 //保证是单机,
 if(dowx == event.getX() & System.currentTimeMillis() - mDownTimel<300)
{
 //回调事件
listener.onViewClick();
}
 break;
标签:
原文地址:http://www.cnblogs.com/ganwei/p/4870480.html