libgdx 实现viewPager效果

4 篇文章 0 订阅
1 篇文章 0 订阅

    最近项目需要加入小游戏的模块,由于自己之前并没有接触过游戏框架,经过项目小组的探讨,最终决定使用libgdx 进行开发小游戏模块。对于新的框架进行了一段时间的学习,在这一过程中经历了九九八十一难,终于将其libgdx 做出了一个效果出来。不过在这一过程中,有一个需求把我给难道了,找了好多百度相关的技术讲解,都没有找到合适的。很多技术上将的都比较浅,最后goole了一下,同时还是没有找到解决办法,就在自己快要绝望的时候 ,找让我找到了一篇技术文档。将其研究了一下 ,不知道怎么了,运行就报错。真的是快要崩溃了,还好“天下无难事,只怕有心人” 。终于将其研究出了。

 

废话不多了 直接看图  不好意思 没有录制gif

 

 

核心代码:

/**
 * Created by zengqiang on 2018/8/21
 * 从入门到放弃
 */
public class PagedScrollPane extends ScrollPane {
    private float pickAmountX;
    private float pickDifferenceX = -1;

    private boolean wasPanDragFling = false;

    private float scrollToPageSpeed = 1000;

    private float pageSpacing;

    private Table content;

    private PagedScrollListener pagedScrollListener;

    private int mCurrent=0;
    private int mTemporary=0;

    private int mScrollDistance=0;

    public PagedScrollPane () {
        super(null);
        content = new Table();
        content.defaults().space(50);
        setWidget(content);
    }

    public void setPagedScrollListener(PagedScrollListener pagedScrollListener) {
        this.pagedScrollListener = pagedScrollListener;
    }

    //    public PagedScrollPane1 (Skin skin) {
//        super(null, skin);
//        content = new Table();
//        content.defaults().space(50);
//        setWidget(content);
//    }
//
//    public PagedScrollPane1 (Skin skin, String styleName) {
//        super(null, skin, styleName);
//        content = new Table();
//        content.defaults().space(50);
//        setWidget(content);
//    }

    public PagedScrollPane (Actor widget, ScrollPaneStyle style) {
        super(null, style);
        content = new Table();
        content.defaults().space(50);
        setWidget(content);
    }

    public void addPages (Actor... pages) {
        for (Actor page : pages) {
            content.add(page).expandY().fillY();
        }
    }

    public void addPage (Actor page) {
        content.add(page).expandY().fillY();
    }

    public Actor getPage (int page) {
        if(content.getCells().size>0){
            return content.getCells().get(page).getActor();
        }
        return  null;
    }



    @Override
    public void act (float delta) {
        super.act(delta);
        if (wasPanDragFling && !isPanning() && !isDragging() && !isFlinging()) {
            wasPanDragFling = false;
            scrollToPage();
        } else {
            if (isPanning() || isDragging() || isFlinging()) {
                wasPanDragFling = true;
            }
        }
    }

    @Override
    public void setWidth (float width) {
        super.setWidth(width);
        if (content != null) {
            for (Cell cell : content.getCells()) {
                cell.width(width);
            }
            content.invalidate();
        }
    }

    public void setPageSpacing (float pageSpacing) {
        if (content != null) {
            content.defaults().space(pageSpacing);
            for (Cell cell : content.getCells()) {
                cell.space(pageSpacing);
            }
            content.invalidate();
        }
    }

    public void setScrollX(int position){
        mCurrent = position;
        mTemporary = position;
        mScrollDistance=Math.round(position * getWidth());
        setScrollX(position * getWidth());
//        if(mTemporary!=mCurrent) { //如何当前下标和临时下标不相等 表示为 页面滑动
//            Gdxlog.log("scrollToPage", "setScrollX=" + mCurrent);
//
//        }
    }

    private synchronized  void scrollToPage () {
        final float width = getWidth();
        final float scrollX = getScrollX();
        final float maxX = getMaxX();

        if (scrollX >= maxX || scrollX <= 0) return;

        Array<Actor> pages = content.getChildren();
        float pageX = 0;
        float pageWidth = 0;
        if (pages.size > 0) {
            for (Actor a : pages) {
                pageX = a.getX();
                pageWidth = a.getWidth();
                if (scrollX < (pageX + pageWidth * 0.4)) {
                    break;
                }
            }

            float maths=MathUtils.clamp(pageX - (width - pageWidth) / 2, 0, maxX);

            setScrollX(maths);

            int size=pages.size;



            if(Math.round(maths)>mScrollDistance){//右滑
                if(maths>=((mCurrent%size)*pageWidth)){
                    mScrollDistance=Math.round(maths);
                    mCurrent++;
                }
            }else  if(Math.round(maths)<mScrollDistance){//左滑
                if(maths>=(((mCurrent-1)%size)*pageWidth)){
                    mScrollDistance=Math.round(maths);
                    mCurrent--;
                }
            }


            if(mTemporary!=mCurrent){ //如何当前下标和临时下标不相等 表示为 页面滑动
                pagedScrollListener.scrollEnd(mCurrent);
                mTemporary=mCurrent;
                Gdxlog.log("scrollToPage","mCurrent="+mCurrent);

            }
        }
    }
}

源码 github:https://github.com/zqMyself/libgdx_ViewPager

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值