学习知识点

  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;

自定义控件ViewPagae<的更多相关文章

  1. android自定义控件一站式入门

    自定义控件 Android系统提供了一系列UI相关的类来帮助我们构造app的界面,以及完成交互的处理. 一般的,所有可以在窗口中被展示的UI对象类型,最终都是继承自View的类,这包括展示最终内容的非 ...

  2. ASP.NET MVC学习之母版页和自定义控件的使用

    一.母板页_Layout.cshtml类似于传统WebForm中的.master文件,起到页面整体框架重用的目地1.母板页代码预览 <!DOCTYPE html> <html> ...

  3. C# 自定义控件VS用户控件

    1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...

  4. 自定义控件之 圆形 / 圆角 ImageView

    一.问题在哪里? 问题来源于app开发中一个很常见的场景——用户头像要展示成圆的:       二.怎么搞? 机智的我,第一想法就是,切一张中间圆形透明.四周与底色相同.尺寸与头像相同的蒙板图片,盖在 ...

  5. 如何开发FineReport的自定义控件?

    FineReport作为插件化开发的报表软件,有些特殊需求的功能需要自己开发,开发的插件包帆软官方有提提供,可以去帆软论坛上找,本文将主要介绍如何开发一个自定义控件,这里讲讲方法论. 第一步:实例化一 ...

  6. WPF自定义控件第二 - 转盘按钮控件

    继之前那个控件,又做了一个原理差不多的控件.这个控件主要模仿百度贴吧WP版帖子浏览界面左下角那个弹出的按钮盘.希望对大家有帮助. 这个控件和之前的也差不多,为了不让大家白看,文章最后发干货. 由于这个 ...

  7. 【Win 10应用开发】AdaptiveTrigger在自定义控件中是可以触发的

    前些天,看到有网友给我留言,说AdaptiveTrigger在自定义控件(模板化控件)中不能触发.因为当时我正在写其他的代码,就没有去做实验来验证,于是我就给这位网友提了使用GotoVisualSta ...

  8. WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

    一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...

  9. Android自定义控件之自定义ViewGroup实现标签云

    前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...

随机推荐

  1. POJ-2926 Requirements 最远曼哈顿距离

    题目链接:http://poj.org/problem?id=2926 题意:求5维空间的点集中的最远曼哈顿距离.. 降维处理,推荐2009武森<浅谈信息学竞赛中的“0”和“1”>以及&l ...

  2. 使用Mono Cecil 动态获取运行时数据 (Atribute形式 进行注入 用于写Log) [此文报考 xxx is declared in another module and needs to be imported的解决方法]-摘自网络

    目录 一:普通写法 二:注入定义 三:Weave函数 四:参数构造 五:业务编写 六:注入调用 7.  怎么调用别的程序集的方法示例 8. [is declared in another module ...

  3. ubuntu免验证登陆权限问题

    由于经常ssh到服务器,每次输入密码很烦.就传了本机公钥到服务器. 和所有教程将的一样,做起来挺简单的. 本机ssh-keygen -t rsa生成公钥和密钥. 将公钥传至服务器,用户目录下.ssh/ ...

  4. ubuntu无法进入和引导顺序问题解决

    今天上班过来发现ubuntu无法进入,因为里面有N多资料没有备份,当时很是捉急.不过后来都解决了: 背景: easyBCD安装ubuntu14.07和windows7双系统.基本上这一年多一直用ubu ...

  5. [C++]VS与第三方工具下载

    名称:Qt 5.1.1 (商业版与开放源码许可GPL/LGPL) 说明:Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架 下载:http://www.qt.io/downl ...

  6. python 使用@property

    在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...

  7. stm32 堆和栈(stm32 Heap & Stack)【worldsing笔记】

    关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的.   那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘:     刚接手STM32时,你只编写一个 int main() ...

  8. HDU 1018 Big Number

    LINK:HDU 1018 题意:求n!的位数~ 由于n!最后得到的数是十进制,故对于一个十进制数,求其位数可以对该数取其10的对数,最后再加1~ 易知:n!=n*(n-1)*(n-2)*...... ...

  9. 我被eclipse的tomcat坑的经历

    奇怪的乱码问题: 1.jsp页面utf-8 2.java代码utf-8 3.数据库编码utf-8 4.tomcat server.xml配置URIEncoding="UTF-8" ...

  10. ModSecurity for Nginx

    Announcing the availability of ModSecurity extension for Nginx ModSecurity for Nginx ModSecurity for ...