最近项目需要加入小游戏的模块,由于自己之前并没有接触过游戏框架,经过项目小组的探讨,最终决定使用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