真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android自定義左右或上下滑動(dòng)翻頁效果

本文實(shí)例為大家分享了Android自定義左右或上下滑動(dòng)翻頁展示的具體代碼,供大家參考,具體內(nèi)容如下

創(chuàng)新互聯(lián)公司是一家專業(yè)提供霞山企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都做網(wǎng)站、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為霞山眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

該自定義的效果和ViewPage+Fragment差不多

上下滑動(dòng)翻頁,繼承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; 
 } 
} 

左右滑動(dòng)翻頁,繼承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; 
 
/** 
 * 作用:實(shí)現(xiàn)上下左右滑動(dòng)翻頁,效果如 微信左右滑動(dòng)效果 
 */ 
 
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=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)前頁面編號(hào) 
  */ 
  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的頁面滑動(dòng)值倍數(shù) 
  private float fill; 
  //當(dāng)前頁面 
  private int pageNo=0; 
  //當(dāng)前滾動(dòng)條的位置 
  private float now=0; 
  //手指點(diǎn)擊的位置 
  private float Down=0; 
  //手指松開的位置 
  private float Up=0; 
  //滑動(dòng)方向 
  private float value=0; 
  //是否為第一次點(diǎn)擊 
  private boolean b=true; 
  //頁面集合 
  private List 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; 
  //簡(jiǎn)化代碼 
  private void insertPage(View view){ 
   view.setLayoutParams(params); 
   pageList.add(view); 
   linearLayout.addView(view); 
  } 
  //滑動(dòng)線程 
  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); 
  } 
 } 
} 

最后還需要一個(gè)類似于碎片一樣的東西

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(); 
} 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


當(dāng)前文章:Android自定義左右或上下滑動(dòng)翻頁效果
文章來源:http://weahome.cn/article/pohsio.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部