本文实例为大家分享了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(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Android ViewPager实现左右滑动翻页效果,包括了Android ViewPager实现左右滑动翻页效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了ViewPager实现左右滑动翻页效果展示的具体代码,供大家参考,具体内容如下 代码如下: 布局文件: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍Android自定义ViewPager实现纵向滑动翻页效果,包括了Android自定义ViewPager实现纵向滑动翻页效果的使用技巧和注意事项,需要的朋友参考一下 抖音几乎已经成为了我们日常生活中使用比较频繁的App,无聊之时或工作之后可以刷一刷短视频来供我们娱乐与放松。看到抖音的视屏切换效果,觉得用ViewPager可以做出一样的效果。想一想之前用的ViewPager都是横向切换
本文向大家介绍Android手势左右滑动效果,包括了Android手势左右滑动效果的使用技巧和注意事项,需要的朋友参考一下 最近想实现Android左滑弹出菜单框,右滑消失菜单这个个功能。了解了一下Android 的滑动事件,必须是在view组件或者Activity上实现,同时必须实现OnTouchListener, OnGestureListener这个两个接口。 以上就是本文的全部内容,希望对
本文向大家介绍Android嵌套RecyclerView左右滑动替代自定义view,包括了Android嵌套RecyclerView左右滑动替代自定义view的使用技巧和注意事项,需要的朋友参考一下 以前的左右滑动效果采用自定义scrollview或者linearlayout来实现,recyclerview可以很好的做这个功能,一般的需求就是要么一个独立的左右滑动效果,要么在一个列表里的中间部分一
本文向大家介绍Android实现微信首页左右滑动切换效果,包括了Android实现微信首页左右滑动切换效果的使用技巧和注意事项,需要的朋友参考一下 大家看到微信首页切换效果有没有觉得很炫,滑动切换,点击底部bar瞬间切换,滑动切换渐变效果,线上效果图: 之前也在博客上看到别人的实现,再次基础上,我做了些优化。首先说下实现原理,大神略过,o(╯□╰)o 页面上看到的三个页面是三个Fragment,
本文向大家介绍Android自定义可左右滑动和点击的折线图,包括了Android自定义可左右滑动和点击的折线图的使用技巧和注意事项,需要的朋友参考一下 前言 前几天有小盆友让我写一个折线图,可以点击,可以左右滑动。对于折线肯定有很多项目都使用过,所以网上肯定也有很多demo,像AndroidChart、HelloChart之类的,功能相当丰富,效果也很赞,但是太重了,其他的小demo