Android自定義左右或上下滑動(dòng)翻頁(yè)效果
本文實(shí)例為大家分享了Android自定義左右或上下滑動(dòng)翻頁(yè)展示的具體代碼,供大家參考,具體內(nèi)容如下
該自定義的效果和ViewPage+Fragment差不多
上下滑動(dòng)翻頁(yè),繼承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)翻頁(yè),繼承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;
}
}
下面的是兩種翻頁(yè)的底層
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)翻頁(yè),效果如 微信左右滑動(dòng)效果
*/
public interface PageSlide {
public TotalSlide getTotalSlide();
public boolean TouchEvent(MotionEvent ev);
public float getScroll();
public void setScroll(Integer value);
class TotalSlide{
/**
* 設(shè)置翻頁(yè)速度
* @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);
}
/**
* 增加頁(yè)面
* @param layout 該頁(yè)面的布局文件
* @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);
}
/**
* 增加頁(yè)面
* @param layout 該頁(yè)面的布局文件
*/
public void addPage(@LayoutRes int layout){
View view=context.getLayoutInflater().inflate(layout,null);
insertPage(view);
}
/**
* 增加頁(yè)面
* @param myAppCompatActivity 該布局文件的java文件
*/
public void addPage(MyAppCompatActivity myAppCompatActivity){
View view=new View(context);
myAppCompatActivity.view=view;
myAppCompatActivity.context=context;
myAppCompatActivity.onCreate();
insertPage(view);
}
/**
* 切換頁(yè)面
* @param pageNo 切換頁(yè)面的下標(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)前頁(yè)面編號(hào)
*/
public int getPageNo(){
return pageNo;
}
/**
* 刪除頁(yè)面
* @param pageNo 刪除頁(yè)面的下標(biāo)
*/
public void removePage(int pageNo) {
if (pageNo < pageList.size() && pageNo >= 0) {
linearLayout.removeView(pageList.get(pageNo));
pageList.remove(pageNo);
}
}
/**********************************************************************************************/
//展示頁(yè)面的Activity
private AppCompatActivity context;
//轉(zhuǎn)換頁(yè)面的速度,默認(rèn)為20
private float speed=20;
//當(dāng)前Activity的頁(yè)面滑動(dòng)值倍數(shù)
private float fill;
//當(dāng)前頁(yè)面
private int pageNo=0;
//當(dāng)前滾動(dòng)條的位置
private float now=0;
//手指點(diǎn)擊的位置
private float Down=0;
//手指松開(kāi)的位置
private float Up=0;
//滑動(dòng)方向
private float value=0;
//是否為第一次點(diǎn)擊
private boolean b=true;
//頁(yè)面集合
private List<View> pageList=new ArrayList<>();
//輔助線程執(zhí)行
private Handler handler=new Handler();
//get方法
private Method get;
//get方法
private Method set;
//本頁(yè)布局控件
LinearLayout linearLayout;
//頁(yè)面大小
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è)類(lèi)似于碎片一樣的東西
package com.hy.View;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
/**
* 分頁(yè)面的java類(lèi)繼承此類(lèi) 取代AppCompatActivity
*/
public abstract class MyAppCompatActivity {
/**
* 當(dāng)作 this 來(lái)用
*/
public AppCompatActivity context;
/**
* 當(dāng)前頁(yè)面的根布局 用它使用 findViewById() 找控件
*/
public View view;
/**
* 初始值在這里面定義
*/
public abstract void onCreate();
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android中圖片翻頁(yè)效果簡(jiǎn)單的實(shí)現(xiàn)方法
- 解析Android中實(shí)現(xiàn)滑動(dòng)翻頁(yè)之ViewFlipper的使用詳解
- Android實(shí)現(xiàn)閱讀APP平移翻頁(yè)效果
- Android自定義ViewPager實(shí)現(xiàn)縱向滑動(dòng)翻頁(yè)效果
- Android?ViewPager實(shí)現(xiàn)左右滑動(dòng)翻頁(yè)效果
- android ViewPager實(shí)現(xiàn)滑動(dòng)翻頁(yè)效果實(shí)例代碼
- 基于Android實(shí)現(xiàn)3D翻頁(yè)效果
- Android 仿日歷翻頁(yè)、仿htc時(shí)鐘翻頁(yè)、數(shù)字翻頁(yè)切換效果
- Android CardView+ViewPager實(shí)現(xiàn)ViewPager翻頁(yè)動(dòng)畫(huà)的方法
- Android實(shí)現(xiàn)翻頁(yè)特效
相關(guān)文章
Android代碼實(shí)現(xiàn)AdapterViews和RecyclerView無(wú)限滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android代碼實(shí)現(xiàn)AdapterViews和RecyclerView無(wú)限滾動(dòng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07
Android 滑動(dòng)監(jiān)聽(tīng)RecyclerView線性流+左右劃刪除+上下移動(dòng)
這篇文章主要介紹了Android 滑動(dòng)監(jiān)聽(tīng)RecyclerView線性流+左右劃刪除+上下移動(dòng)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
Android?App實(shí)現(xiàn)閃屏頁(yè)廣告圖的全屏顯示實(shí)例
這篇文章主要為大家介紹了Android?App實(shí)現(xiàn)閃屏頁(yè)廣告圖的全屏顯示實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Android實(shí)現(xiàn)信號(hào)強(qiáng)度監(jiān)聽(tīng)的方法
這篇文章主要介紹了Android實(shí)現(xiàn)信號(hào)強(qiáng)度監(jiān)聽(tīng)的方法,是Android手機(jī)中很常見(jiàn)的一個(gè)實(shí)用功能,需要的朋友可以參考下2014-08-08
android防止提交事件時(shí)觸發(fā)多個(gè)表單中的按鈕
這篇文章主要介紹了android防止提交事件時(shí)觸發(fā)多個(gè)表單中的按鈕,2015-05-05
Android中ImageView無(wú)法居中的問(wèn)題解決方法
做UI布局,尤其是遇到比較復(fù)雜的多重LinearLayout嵌套,常常會(huì)被一些比較小的問(wèn)題困擾上半天,比如今天在使用ImageView的時(shí)候,想讓其居中顯示,可是無(wú)論怎樣設(shè)置layout_gravity屬性,都無(wú)法達(dá)到效果2013-06-06
Android Studio實(shí)現(xiàn)簡(jiǎn)易登錄界面制作
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)簡(jiǎn)易登錄界面制作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04

