android 向左滑动动画,Android自定义左右或上下滑动翻页效果

本文实例为大家分享了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=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 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();

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android中实现左右滑动动画,可以使用ViewPager。ViewPager是一个视图容器,可以让用户在屏幕上左右滑动,以便浏览多个页面。 下面是一些步骤,以实现ViewPager左右滑动翻页效果: 1. 在布局文件中添加ViewPager。 ```xml <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" /> ``` 2. 在MainActivity中,创建一个PagerAdapter类,它将管理页面。 ```java public class MyPagerAdapter extends PagerAdapter { private List<View> viewList; public MyPagerAdapter(List<View> viewList) { this.viewList = viewList; } @Override public int getCount() { return viewList.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(viewList.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(viewList.get(position)); return viewList.get(position); } } ``` 3. 在MainActivity中,为ViewPager设置PagerAdapter。 ```java ViewPager viewPager = findViewById(R.id.viewPager); List<View> viewList = new ArrayList<>(); viewList.add(new View(this)); viewList.add(new View(this)); viewList.add(new View(this)); MyPagerAdapter adapter = new MyPagerAdapter(viewList); viewPager.setAdapter(adapter); ``` 现在,当用户在ViewPager中左右滑动时,页面将滑动到下一页,实现了左右滑动翻页效果。 当然,你可以在PagerAdapter中添加自己的View,以实现更多的自定义效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值