zoukankan      html  css  js  c++  java
  • 开源Pull_To_Refresh控件使用

    学习知识点

    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;
  • 相关阅读:
    企业微信小程序用getImageInfo保存图片提示fail download image fail
    post提交定义传输数据格式-设置请求头content-type
    微信小程序-wxml模板页面逻辑运算
    微信小程序-页面间传参
    微信小程序-wxml标签绑定data值传参给js方法(事件传参)
    微信小程序-子组件调用父组件
    微信小程序-调用组件内方法(父组件调用子组件)
    input中number类型去掉上下箭头
    js slice 截取数组或字符串
    vue组件库小练习——目录
  • 原文地址:https://www.cnblogs.com/ganwei/p/4870480.html
Copyright © 2011-2022 走看看