国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

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

2019-10-22 18:18:45
字體:
來源:轉載
供稿:網友

本文實例為大家分享了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(); } 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海盐县| 海南省| 凌源市| 平山县| 贡山| 衡阳县| 怀来县| 奉节县| 连南| 东乌珠穆沁旗| 怀柔区| 虞城县| 竹溪县| 九台市| 武邑县| 扶绥县| 晋城| 辉南县| 家居| 喀什市| 廊坊市| 靖江市| 铁岭县| 涡阳县| 岗巴县| 滦南县| 吉林省| 乐亭县| 九龙坡区| 班玛县| 福海县| 梁平县| 信丰县| 仙居县| 开化县| 台东县| 衡阳市| 屯昌县| 卢氏县| 开江县| 永安市|