Android自定义左右或上下滑动翻页效果

本文实例为大家分享了Android自定义左右或上下滑动翻页展示的具体代码,供大家参考,具体内容如下

该自定义的效果和ViewPage+Fragment差不多

上下滑动翻页,继承ScrollView

public class SlideScrollView extends ScrollView implements PageSlide{
 private TotalSlide totalSlide;
 public SlideScrollView(AppCompatActivity context) {
  super(context);
  try {
   totalSlide=new TotalSlide(this,context);
  } catch (NoSuchMethodException e) {
   e.printStackTrace();
  }
  totalSlide.init(context);
  totalSlide.linearLayout.setOrientation(totalSlide.linearLayout.VERTICAL);
  this.setLayoutParams(totalSlide.params);
  this.setVerticalScrollBarEnabled(false);
  this.addView(totalSlide.linearLayout);
 }
 public float getScroll() {
  return super.getScrollY();
 }
 public void setScroll(Integer value) {
  super.setScrollY(value);
 }
 @Override
 public boolean onTouchEvent(MotionEvent ev) {
  try {
   return totalSlide.MyTouchEvent(ev);
  } catch (InvocationTargetException e) {
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   e.printStackTrace();
  }
  return TouchEvent(ev);
 }
 public boolean TouchEvent(MotionEvent ev){
  return super.onTouchEvent(ev);
 }
 public TotalSlide getTotalSlide(){
  return this.totalSlide;
 }
}

左右滑动翻页,继承HorizontalScrollView

public class SlideHorizontalScrollView extends HorizontalScrollView implements PageSlide{
  private TotalSlide totalSlide;
  public SlideHorizontalScrollView(AppCompatActivity context){
    super(context);
    try {
      totalSlide=new TotalSlide(this,context);
    } catch (NoSuchMethodException e) {
      e.printStackTrace();
    }
    totalSlide.init(context);
    totalSlide.linearLayout.setOrientation(totalSlide.linearLayout.HORIZONTAL);
    this.setLayoutParams(totalSlide.params);
    this.setHorizontalScrollBarEnabled(false);
    this.addView(totalSlide.linearLayout);
  }
  public float getScroll() {
    return getScrollX();
  }
  public void setScroll(Integer value) {
    setScrollX(value);
  }
  @Override
  public boolean onTouchEvent(MotionEvent ev) {
    try {
      return totalSlide.MyTouchEvent(ev);
    } catch (InvocationTargetException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    return TouchEvent(ev);
  }
  public boolean TouchEvent(MotionEvent ev){
    return super.onTouchEvent(ev);
  }
  public TotalSlide getTotalSlide(){
    return this.totalSlide;
  }
}

下面的是两种翻页的底层

package com.hy.View; 

import android.os.Handler;
import android.support.annotation.LayoutRes;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout; 

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; 

/**
 * 作用:实现上下左右滑动翻页,效果如 微信左右滑动效果
 */ 

public interface PageSlide {
  public TotalSlide getTotalSlide();
  public boolean TouchEvent(MotionEvent ev);
  public float getScroll();
  public void setScroll(Integer value);
  class TotalSlide{
    /**
     * 设置翻页速度
     * @param speed 速度,默认为20
     */
    public void setSpeed(float speed){
      this.speed=speed;
    }
    TotalSlide(PageSlide pageSlide,AppCompatActivity context) throws NoSuchMethodException {
      this.pageSlide=pageSlide;
      this.context=context;
      WindowManager wm = context.getWindowManager();
      if(pageSlide instanceof SlideHorizontalScrollView){
        fill = wm.getDefaultDisplay().getWidth();
        get=pageSlide.getClass().getMethod("getScroll");
        set=pageSlide.getClass().getMethod("setScroll",Integer.class);
        //Toast.makeText(context,"TotalSlide:"+get.getName(),Toast.LENGTH_LONG).show();
      }else if(pageSlide instanceof SlideScrollView){
        fill = wm.getDefaultDisplay().getHeight();
        get=pageSlide.getClass().getMethod("getScroll");
        set=pageSlide.getClass().getMethod("setScroll",Integer.class);
      }
    }
    //初始化
    void init(AppCompatActivity context){
      DisplayMetrics metrics = new DisplayMetrics();
      context.getWindowManager().getDefaultDisplay().getMetrics(metrics);
      params = new LinearLayout.LayoutParams(metrics.widthPixels, metrics.heightPixels);
      linearLayout = new LinearLayout(context);
      linearLayout.setLayoutParams(params);
    }
    /**
     * 增加页面
     * @param layout 该页面的布局文件
     * @param myAppCompatActivity 该布局文件的java文件
     */
    public void addPage(@LayoutRes int layout, MyAppCompatActivity myAppCompatActivity){
      View view=context.getLayoutInflater().inflate(layout,null);
      myAppCompatActivity.view=view;
      myAppCompatActivity.context=context;
      myAppCompatActivity.onCreate();
      insertPage(view);
    }
    /**
     * 增加页面
     * @param layout 该页面的布局文件
     */
    public void addPage(@LayoutRes int layout){
      View view=context.getLayoutInflater().inflate(layout,null);
      insertPage(view);
    }
    /**
     * 增加页面
     * @param myAppCompatActivity 该布局文件的java文件
     */
    public void addPage(MyAppCompatActivity myAppCompatActivity){
      View view=new View(context);
      myAppCompatActivity.view=view;
      myAppCompatActivity.context=context;
      myAppCompatActivity.onCreate();
      insertPage(view);
    }
    /**
     * 切换页面
     * @param pageNo 切换页面的下标
     */
    public void changePage(int pageNo) {
      if(pageNo<pageList.size()&&pageNo>=0){
        now=fill*pageNo;
        try {
          set.invoke(pageSlide,(int)now);
        } catch (IllegalAccessException e) {
          e.printStackTrace();
        } catch (InvocationTargetException e) {
          e.printStackTrace();
        }
        this.pageNo=pageNo;
      }
    } 

    /**
    * @return 返回当前页面编号
    */
    public int getPageNo(){
      return pageNo;
    }
    /**
     * 删除页面
     * @param pageNo 删除页面的下标
     */
    public void removePage(int pageNo) {
      if (pageNo < pageList.size() && pageNo >= 0) {
        linearLayout.removeView(pageList.get(pageNo));
        pageList.remove(pageNo);
      }
    }
    /**********************************************************************************************/
    //展示页面的Activity
    private AppCompatActivity context;
    //转换页面的速度,默认为20
    private float speed=20;
    //当前Activity的页面滑动值倍数
    private float fill;
    //当前页面
    private int pageNo=0;
    //当前滚动条的位置
    private float now=0;
    //手指点击的位置
    private float Down=0;
    //手指松开的位置
    private float Up=0;
    //滑动方向
    private float value=0;
    //是否为第一次点击
    private boolean b=true;
    //页面集合
    private List<View> pageList=new ArrayList<>();
    //辅助线程执行
    private Handler handler=new Handler();
    //get方法
    private Method get;
    //get方法
    private Method set;
    //本页布局控件
    LinearLayout linearLayout;
    //页面大小
    LinearLayout.LayoutParams params;
    //多态
    private PageSlide pageSlide;
    //简化代码
    private void insertPage(View view){
      view.setLayoutParams(params);
      pageList.add(view);
      linearLayout.addView(view);
    }
    //滑动线程
    private Runnable runnable=new Runnable() {
      @Override
      public void run() {
        try {
          if((b&&(float)get.invoke(pageSlide)>=now)||(!b&&(float)get.invoke(pageSlide)<=now)){
            set.invoke(pageSlide,(int) (now-value));
            b=true;
            handler.removeCallbacks(runnable);
          }else{
            handler.postDelayed(runnable,1);
          }
          if(now==0&&value>0) {
            set.invoke(pageSlide,(int)((float)get.invoke(pageSlide)));
          }else{
            set.invoke(pageSlide,(int)((float)get.invoke(pageSlide)+value));
          }
        } catch (IllegalAccessException e) {
          e.printStackTrace();
        } catch (InvocationTargetException e) {
          e.printStackTrace();
        }
      }
    };
    //手指判断
    public boolean MyTouchEvent(MotionEvent ev) throws InvocationTargetException, IllegalAccessException {
      if(b){
        Down=(float)get.invoke(pageSlide);
        b=false;
      }
      if(ev.getAction()==MotionEvent.ACTION_UP){
        Up=(float)get.invoke(pageSlide);
        value=Up>Down?Up-Down:Down-Up;
        b=Up>Down?true:false;
        if(value>250){
          value=b?speed:-speed;
          now=b?now+fill:now-fill;
          pageNo= (int) (now/fill);
          handler.post(runnable);
        }else{
          value=b?-speed:speed;
          handler.post(runnable);
        }
        return false;
      }
      return pageSlide.TouchEvent(ev);
    }
  }
}

最后还需要一个类似于碎片一样的东西

package com.hy.View; 

import android.support.v7.app.AppCompatActivity;
import android.view.View; 

/**
 * 分页面的java类继承此类 取代AppCompatActivity
 */ 

public abstract class MyAppCompatActivity {
 /**
  * 当作 this 来用
  */
 public AppCompatActivity context;
 /**
  * 当前页面的根布局 用它使用 findViewById() 找控件
  */
 public View view;
 /**
  * 初始值在这里面定义
  */
 public abstract void onCreate();
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 解析Android中实现滑动翻页之ViewFlipper的使用详解

    1)View切换的控件-ViewFlipper介绍 ViewFilpper类继承于ViewAnimator类.而ViewAnimator类继承于FrameLayout. 查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果.该类有如下几个和动画相关的方法. setInAnimation:设置View进入屏幕时候使用的动画.该方法有两个重载方法,即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID. setOut

  • android ViewPager实现滑动翻页效果实例代码

    实现ViewPager的滑动翻页效果可以使用ViewPager的setPageTransformer方法,如下: import android.content.Context; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.View; public class ReadViewPager extends ViewPager { public ReadV

  • Android自定义左右或上下滑动翻页效果

    本文实例为大家分享了Android自定义左右或上下滑动翻页展示的具体代码,供大家参考,具体内容如下 该自定义的效果和ViewPage+Fragment差不多 上下滑动翻页,继承ScrollView public class SlideScrollView extends ScrollView implements PageSlide{ private TotalSlide totalSlide; public SlideScrollView(AppCompatActivity context)

  • Android自定义ViewPager实现纵向滑动翻页效果

    抖音几乎已经成为了我们日常生活中使用比较频繁的App,无聊之时或工作之后可以刷一刷短视频来供我们娱乐与放松.看到抖音的视屏切换效果,觉得用ViewPager可以做出一样的效果.想一想之前用的ViewPager都是横向切换的,虽然很经常用,但是从来没实现过竖向的切换效果,说做就做吧. 我们先看一波效果图: 那么,要想实现这样的效果,当然是自定义ViewPager啦.问了一下度娘,看到有这样一种思路: 首先,把Touch事件的x,y坐标做一下交换,从原先的x坐标差值转变成y坐标的差值,正符合了我们手

  • Android ViewPager实现左右滑动翻页效果

    本文实例为大家分享了ViewPager实现左右滑动翻页效果展示的具体代码,供大家参考,具体内容如下 代码如下: package com.example.demo; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import a

  • 使用jQueryMobile实现滑动翻页效果的方法

    本文实例讲述了使用jQueryMobile实现滑动翻页效果的方法.分享给大家供大家参考.具体分析如下: 滑动手势在移动设备是很流行的,在移动设备中滑动翻页中很常见 虽然这个功能可以在jQueryMobile中实现,但是个人与之前一篇[jQuery手机浏览器中拖拽动作的艰难性分析]中的观点一致,由于这是在手机浏览器中浏览,而不是安卓的一个独立APP,所以不要经常除点击以外的移动设备手势,以免跟手机浏览器与手机系统本身的手势发生冲突. 那么,使用jQueryMobile实现滑动翻页的效果到底怎么做呢

  • vue-awesome-swiper 基于vue实现h5滑动翻页效果【推荐】

    说到h5的翻页,很定第一时间想到的是swiper.但是我当时想到的却是,vue里边怎么用swiper?! vue-awesome-swiper就是其中一个前辈们产出的结晶.就看首尾两个单词,就知道他是vue和swiper的爱情之子了. vue-awesome-swiper官网是中文文档,妈妈再也不用担心我读api啦."基于 Swiper4.适用于 Vue 的轮播组件".在产品催着进度的紧张环境下,在四处搜寻解决方案的情况下,这句话简直发着光啊. 具体怎么用,官方文档写的很清楚,但我还是

  • 微信小程序实现滑动翻页效果(完整代码)

    微信小程序实现滑动翻页效果,效果图如下所示: 源码: <view class="mainFrame"> <swiper class="container" indicator-dots="{{indicatorDots}}" indicator-dots="{{indicatordots}}" autoplay="{{autoplay}}" interval="{{interva

  • Unity UGUI实现滑动翻页效果

    本文实例为大家分享了Unity UGUI实现滑动翻页效果的具体代码,供大家参考,具体内容如下 这个问题真的是老生常谈的事情了,不过在这里还是要说一下,以便以后之需 首先看一下效果图 最后在Content下面是一些Image using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using UnityEngine.EventSystems; using

  • 通过滑动翻页效果实现和移动端click事件问题

    前述 本文很短~ 主要是为了总结和讲述移动端click和js事件机制导致的一个问题. (:咳咳,其实几句话就能写完的还要水一篇文章,不愧是我- 正文 最近做了一个小活动,里面要用到一个效果:滑动翻页.大概是这样的: <!-- HTML代码 --> <div class="page-container"> <div class="page" style="background: #dc3b26">1</di

  • Android通过手势实现答题器翻页效果

    本文实例为大家分享了Android答题器翻页功能,主要使用ViewFilpper和GestureDetector来实现,供大家参考,具体内容如下 1.效果图 2.实现思路 把Activity的TouchEvent事件交个GestureDetector来处理,然后使用ViewFilpper使用动画控制多个组件的之间的切换效果.手势的一个Api就不详细说了,大家如果不了解可以查一下. 3.实现的步骤 1).构建手势检测器 2).准备数据 3).为ViewFilpper添加子控件. 4).初始化Ani

随机推荐