学习知识点

  1. onTouch事件传递机制。
  2. Lisenter监听
  3. ImageViewsrc background scaleType不同属性的显示情况。
  4. onTouch滑动抬起调用的MotionEvent.ACTION_CANCEL不是MotionEvent.ACTION_UP

开发步骤

① 创建Activity Layout
② 继承ViewPager 创建AutoScrollViewPager
③ 显示点
④ 添加监听OnPageChangedListener
⑤ 自动滚动
⑥ 手动滚动时 停止滚动

继承ViewPager 创建AutoScrollViewPager

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设计模式

原理:

  1. 设置监听接口,定义方法
 private OnViewClickListener listener ;
public interface OnViewClickListener
{
public void onViewClick();
}
  1. 设置监听方法
 public void setOnViewClickListener(OnViewClickListener listener)
{
this.listener = listener;
}
  1. 在触摸ACTION_UP调用回调方法
 case MotionEvent.ACTION_UP:
startScroll();
//保证是单机,
if(dowx == event.getX() & System.currentTimeMillis() - mDownTimel<300)
{
//回调事件
listener.onViewClick();
}

break;

开源Pull_To_Refresh控件使用的更多相关文章

  1. 基于存储过程的MVC开源分页控件

    基于存储过程的MVC开源分页控件--LYB.NET.SPPager 摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件M ...

  2. 这可能是目前最轻量级、最支持MVVM、可定制性最高的开源Chart控件!

    由于项目中经常用到Series Chart,而目前市面又实在找不到既支持MVVM,又轻量级的开源Chart控件,于是干脆就花了两周时间随手写了一个.昨天感觉还比较满意,就发布到了Github上:htt ...

  3. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  4. 基于存储过程的MVC开源分页控件--LYB.NET.SPPager

    摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件MVCPager(http://www.webdiyer.com/)算 ...

  5. 一款漂亮实用的Android开源日期控件timessquare

    这个开源控件可以兼容到SDK8版本,可以自定义显示的年月日,以及时间范围,如图 如果我们只想显示两个月的日期选择区间: final Calendar month = Calendar.getInsta ...

  6. Android 开源简单控件

    Android开源系列分类 查看 CircleImageView 自定义圆形控件的使用 添加依赖 ‘de.hdodenhof:circleimageview:2.1.0' 作用:无论你设置的图片是什么 ...

  7. 转--一款漂亮实用的Android开源日期控件timessquare

    这个开源控件可以兼容到SDK8版本,可以自定义显示的年月日,以及时间范围,如图 如果我们只想显示两个月的日期选择区间: final Calendar month = Calendar.getInsta ...

  8. 开源布局控件 WeifenLuo.WinFormsUI.Docking.dll使用

    WeifenLuo.WinFormsUI.Docking是一个很强大的界面布局控件,可以保存自定义的布局为XML文件,可以加载XML配置文件.! 先看一下效果 使用说明: 1.新建一个WinForm程 ...

  9. [开源]WinForm 控件使用总结

    背景 都2019年了,还在用WinForm吗?哈哈,其实我也没在用,都是很多年前一些项目积累,所以代码写的有些屎,之所以开源出来,希望能给大家有所帮助,喜欢的话给 一个Star以资鼓励~: 具体代码: ...

随机推荐

  1. algorithm@ Divide two integers without using multiplication, division and mod operator. (Bit Operation)

    #include<bits/stdc++.h> using namespace std; int divide(int dividend, int divisor) { long long ...

  2. Android实例-操作sqlite数据库之Grid显示图片(XE8+小米2)

    结果: 1.数据库文件,记得打包到程序中(assets\internal\). 操作方法: 1.新建firemonkey mobile application①菜单->File->New- ...

  3. STC12C5A60S2片内存储器介绍

    STC12C5A60S2内部集成RAM 1280字节,其中 内部RAM(data):256 Byte 内部扩展RAM(xdata):1024 Byte 支持片外扩展RAM: 64kB STC12C5A ...

  4. hdu 1437 天气情况【概率DP】

    天气情况 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. CSS modules 与 React中实践

    最近一直在学习React,看上去蛮简单的内容,其实学习曲线还是比较高的. 目前学到css绑定的问题,看到有一篇好的文章,就转过来了. CSS 模块化的解决方案有很多,但主要有两类.一类是彻底抛弃 CS ...

  6. JAVA js的escape函数、解析用js encodeURI编码的字符串、utf8转gb2312的函数

    在使用webView时,如果url中参数有中文的话,拦截到的字符串就会类似这样的:http://api.letstar.cn/zq/news.html?id=20&cupName=%E6%B5 ...

  7. 【转】/etc/grub.conf文件详解

    转自:http://leejia.blog.51cto.com/4356849/788902 grub.conf是grub的主配置文件,通过这个配置文件,grub才能找到kernel,系统才能正常启动 ...

  8. [Javascript] Webpack Loaders, Source Maps, and ES6

    Using ES6 To use ES6, we need loader. Modify webpack.config.js file: module.exports = { entry: './in ...

  9. Vim文本编辑器 指令簿(二)

    常常处理文本以及常常须要写代码的人,都会有自己比較常常使用的编辑器,本人喜欢用Vim.理由就是Vim编辑器灵活,而且能够达到纯键盘操作,使用纯熟情况下,根本不须要鼠标操作.听起来是不是非常酷的?只是别 ...

  10. Android手机上判断网络运营商

    我们想获取手机的运营商信息.通常都会去调用系统的TelephonyManager类的取数据.但是很多时候可能取不到卡的信息(例如双卡手机和 一些特殊卡),这样就区别不了运营商了.但是有时候我们的需求要 ...