欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義左右或上下滑動翻頁效果

 更新時間:2022年05月10日 08:19:44   作者:漫不_經(jīng)心  
這篇文章主要為大家詳細(xì)介紹了Android自定義左右或上下滑動翻頁效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android項目中引入aar包的正確方法介紹

    Android項目中引入aar包的正確方法介紹

    生成aar之后下一步就是如何引用本地的aar文件,下面這篇文章主要給大家介紹了關(guān)于Android項目中引入aar包的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Android自定義View獲取注冊驗證碼倒計時按鈕

    Android自定義View獲取注冊驗證碼倒計時按鈕

    這篇文章主要介紹了Android自定義View獲取驗證碼倒計時按鈕的制作方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Android中封裝RecyclerView實現(xiàn)添加頭部和底部示例代碼

    Android中封裝RecyclerView實現(xiàn)添加頭部和底部示例代碼

    這篇文章主要給大家介紹了關(guān)于Android中封裝RecyclerView實現(xiàn)添加頭部和底部的相關(guān)資料,網(wǎng)上這方面的資料很多,但都不是自己需要的,索性自己寫一個分享出來供大家參考學(xué)習(xí),需要的朋友們下面隨著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播實例詳解

    Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播實例詳解

    這篇文章主要介紹了Android啟動內(nèi)置APK和動態(tài)發(fā)送接收自定義廣播實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Android draw9patch 圖片制作與使用詳解

    Android draw9patch 圖片制作與使用詳解

    本文主要介紹Android draw9patch的圖片使用和制作,這里詳細(xì)說明如何操作,并幫大家整理了幾句口令,幫助大家記住,有興趣的小伙伴可以參考下
    2016-09-09
  • android圖片壓縮的3種方法實例

    android圖片壓縮的3種方法實例

    這篇文章介紹了android圖片壓縮的3種方法實例,有需要的朋友可以參考一下
    2013-09-09
  • 如何快速創(chuàng)建Android模擬器

    如何快速創(chuàng)建Android模擬器

    這篇文章主要為大家詳細(xì)介紹了快速創(chuàng)建Android模擬器的方法,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Android如何實現(xiàn)藍(lán)牙配對連接功能

    Android如何實現(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聊天功能代碼示例

    本篇文章主要介紹了基于Socket.IO實現(xiàn)Android聊天功能代碼示例,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • Android BroadcastReceiver傳輸機制詳解

    Android 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

最新評論