Android自定義左右或上下滑動翻頁效果
本文實例為大家分享了Android自定義左右或上下滑動翻頁展示的具體代碼,供大家參考,具體內(nèi)容如下
該自定義的效果和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; /** * 作用:實現(xiàn)上下左右滑動翻頁,效果如 微信左右滑動效果 */ public interface PageSlide { public TotalSlide getTotalSlide(); public boolean TouchEvent(MotionEvent ev); public float getScroll(); public void setScroll(Integer value); class TotalSlide{ /** * 設(shè)置翻頁速度 * @param speed 速度,默認(rèn)為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 切換頁面的下標(biāo) */ 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 返回當(dāng)前頁面編號 */ public int getPageNo(){ return pageNo; } /** * 刪除頁面 * @param pageNo 刪除頁面的下標(biāo) */ public void removePage(int pageNo) { if (pageNo < pageList.size() && pageNo >= 0) { linearLayout.removeView(pageList.get(pageNo)); pageList.remove(pageNo); } } /**********************************************************************************************/ //展示頁面的Activity private AppCompatActivity context; //轉(zhuǎn)換頁面的速度,默認(rèn)為20 private float speed=20; //當(dāng)前Activity的頁面滑動值倍數(shù) private float fill; //當(dāng)前頁面 private int pageNo=0; //當(dāng)前滾動條的位置 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<>(); //輔助線程執(zhí)行 private Handler handler=new Handler(); //get方法 private Method get; //get方法 private Method set; //本頁布局控件 LinearLayout linearLayout; //頁面大小 LinearLayout.LayoutParams params; //多態(tài) 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 { /** * 當(dāng)作 this 來用 */ public AppCompatActivity context; /** * 當(dāng)前頁面的根布局 用它使用 findViewById() 找控件 */ public View view; /** * 初始值在這里面定義 */ public abstract void onCreate(); }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android中圖片翻頁效果簡單的實現(xiàn)方法
- 解析Android中實現(xiàn)滑動翻頁之ViewFlipper的使用詳解
- Android實現(xiàn)閱讀APP平移翻頁效果
- Android自定義ViewPager實現(xiàn)縱向滑動翻頁效果
- Android?ViewPager實現(xiàn)左右滑動翻頁效果
- android ViewPager實現(xiàn)滑動翻頁效果實例代碼
- 基于Android實現(xiàn)3D翻頁效果
- Android 仿日歷翻頁、仿htc時鐘翻頁、數(shù)字翻頁切換效果
- Android CardView+ViewPager實現(xiàn)ViewPager翻頁動畫的方法
- Android實現(xiàn)翻頁特效
相關(guān)文章
Android中封裝RecyclerView實現(xiàn)添加頭部和底部示例代碼
這篇文章主要給大家介紹了關(guān)于Android中封裝RecyclerView實現(xiàn)添加頭部和底部的相關(guān)資料,網(wǎng)上這方面的資料很多,但都不是自己需要的,索性自己寫一個分享出來供大家參考學(xué)習(xí),需要的朋友們下面隨著小編一起來學(xué)習(xí)學(xué)習(xí)吧。2017-08-08Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播實例詳解
這篇文章主要介紹了Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播實例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06Android如何實現(xiàn)藍(lán)牙配對連接功能
Android 并沒有開放配對連接耳機的接口,而且網(wǎng)上大部分資料都是講解如何連接藍(lán)牙4.0的,很少有資料詳細(xì)介紹藍(lán)牙2.0相關(guān)的。期間還是踩了不少坑才摸索出解決辦法。所以把我自己摸索總結(jié)出來的經(jīng)驗梳理記錄下,以便備份2021-05-05基于Socket.IO實現(xiàn)Android聊天功能代碼示例
本篇文章主要介紹了基于Socket.IO實現(xiàn)Android聊天功能代碼示例,具有一定的參考價值,有興趣的可以了解一下2017-08-08Android BroadcastReceiver傳輸機制詳解
Android開發(fā)的四大組件分別是:活動(activity),用于表現(xiàn)功能;服務(wù)(service),后臺運行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個應(yīng)用中存儲和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫,本篇著重介紹廣播組件2023-01-01