Implement PagedView
This commit is contained in:
parent
8e441e2b96
commit
8577f3bd79
3 changed files with 248 additions and 105 deletions
|
@ -7,57 +7,11 @@
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:fitsSystemWindows="true"
|
android:fitsSystemWindows="true"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
<LinearLayout android:id="@+id/container"
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/container"
|
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="fill_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical"
|
android:paddingBottom="60dp"/>
|
||||||
android:paddingBottom="60dp"
|
|
||||||
android:weightSum="100">
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_weight="20"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:id="@+id/image"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="fill_horizontal|top|start"
|
|
||||||
android:layout_marginBottom="16dp"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:adjustViewBounds="true" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/title"
|
|
||||||
style="@android:style/TextAppearance.DeviceDefault.Large"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:gravity="center_horizontal|bottom"
|
|
||||||
android:paddingEnd="16dp"
|
|
||||||
android:paddingStart="16dp"
|
|
||||||
android:text="Lorem ipsum dolor sit amet"
|
|
||||||
android:textColor="#FFF"
|
|
||||||
android:layout_weight="80" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/content"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginTop="16dp"
|
|
||||||
android:layout_marginBottom="32dp"
|
|
||||||
android:gravity="center_horizontal"
|
|
||||||
android:paddingEnd="32dp"
|
|
||||||
android:paddingStart="32dp"
|
|
||||||
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tempus elementum sem congue laoreet. Sed pulvinar at purus quis aliquet. Quisque feugiat sed leo nec aliquet. In hac habitasse platea dictumst. Vestibulum enim sapien, gravida et tempus vel, feugiat in turpis. Fusce interdum elit et libero rhoncus dapibus"
|
|
||||||
android:textColor="#FFF"
|
|
||||||
android:textSize="14sp"/>
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
android:id="@+id/buttonContainer"
|
android:id="@+id/buttonContainer"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|
46
res/layout/tutorial_step.xml
Normal file
46
res/layout/tutorial_step.xml
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_weight="1">
|
||||||
|
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/image"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="fill_horizontal|top"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:adjustViewBounds="true" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/title"
|
||||||
|
style="@android:style/TextAppearance.DeviceDefault.Large"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="50dp"
|
||||||
|
android:gravity="center_horizontal|bottom"
|
||||||
|
android:paddingEnd="16dp"
|
||||||
|
android:paddingStart="16dp"
|
||||||
|
android:text="Lorem ipsum dolor sit amet"
|
||||||
|
android:textColor="#FFF" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/content"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="80dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_marginBottom="32dp"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:paddingEnd="32dp"
|
||||||
|
android:paddingStart="32dp"
|
||||||
|
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec tempus elementum sem congue laoreet. Sed pulvinar at purus quis aliquet. Quisque feugiat sed leo nec aliquet. In hac habitasse platea dictumst. Vestibulum enim sapien, gravida et tempus vel, feugiat in turpis. Fusce interdum elit et libero rhoncus dapibus"
|
||||||
|
android:textColor="#FFF"
|
||||||
|
android:textSize="14sp"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
|
@ -1,26 +1,159 @@
|
||||||
package in.celest.xash3d;
|
package in.celest.xash3d;
|
||||||
|
|
||||||
|
import android.animation.*;
|
||||||
import android.app.*;
|
import android.app.*;
|
||||||
|
import android.content.*;
|
||||||
import android.os.*;
|
import android.os.*;
|
||||||
|
import android.util.*;
|
||||||
import android.view.*;
|
import android.view.*;
|
||||||
|
import android.view.View.*;
|
||||||
import android.widget.*;
|
import android.widget.*;
|
||||||
|
import android.widget.TableRow.*;
|
||||||
import in.celest.xash3d.hl.*;
|
import in.celest.xash3d.hl.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import su.xash.fwgslib.*;
|
import su.xash.fwgslib.*;
|
||||||
|
|
||||||
|
import android.view.View.MeasureSpec;
|
||||||
|
|
||||||
public class XashTutorialActivity extends Activity implements View.OnClickListener
|
public class XashTutorialActivity extends Activity implements View.OnClickListener
|
||||||
{
|
{
|
||||||
private Button next, prev;
|
private Button next, prev;
|
||||||
private LinearLayout indicatorLayout;
|
private LinearLayout indicatorLayout;
|
||||||
private FrameLayout containerLayout;
|
private FrameLayout containerLayout;
|
||||||
private RelativeLayout buttonContainer;
|
private RelativeLayout buttonContainer;
|
||||||
private TextView title;
|
|
||||||
private TextView text;
|
|
||||||
private ImageView drawable;
|
|
||||||
|
|
||||||
private int currentItem;
|
private int currentItem;
|
||||||
|
|
||||||
private int prevText, nextText, finishText, cancelText;
|
private int prevText, nextText, finishText, cancelText, numPages;
|
||||||
|
static class PagedView extends HorizontalScrollView
|
||||||
|
{
|
||||||
|
boolean isDelayed, isInc, anim;
|
||||||
|
int lastScroll, pageWidth, currentPage, numPages, targetPage;
|
||||||
|
float firstx,lastx;
|
||||||
|
LinearLayout pageContainer;
|
||||||
|
ViewGroup.LayoutParams pageParams;
|
||||||
|
|
||||||
|
// allow detect animation end
|
||||||
|
static abstract class OnPageListener
|
||||||
|
{
|
||||||
|
abstract public void onPage(int page);
|
||||||
|
}
|
||||||
|
OnPageListener listener;
|
||||||
|
|
||||||
|
public PagedView(Context ctx, int pagewidth)
|
||||||
|
{
|
||||||
|
super(ctx);
|
||||||
|
pageContainer = new LinearLayout(ctx);
|
||||||
|
pageContainer.setOrientation(LinearLayout.HORIZONTAL);
|
||||||
|
setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
|
||||||
|
setScrollBarStyle(SCROLLBARS_INSIDE_INSET);
|
||||||
|
addView(pageContainer);
|
||||||
|
pageWidth = pagewidth;
|
||||||
|
// this will be applied to every page
|
||||||
|
pageParams = new ViewGroup.LayoutParams(pagewidth, LayoutParams.FILL_PARENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void animateScroll()
|
||||||
|
{
|
||||||
|
if( !anim )
|
||||||
|
{
|
||||||
|
// allow only correct position if anim disabled
|
||||||
|
scrollTo(pageWidth*currentPage,0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if( isInc && lastScroll >= pageWidth * targetPage || !isInc && lastScroll <= pageWidth * targetPage )
|
||||||
|
{
|
||||||
|
// got target page, stop now
|
||||||
|
anim = false;
|
||||||
|
currentPage = targetPage;
|
||||||
|
scrollTo(pageWidth*targetPage,0);
|
||||||
|
if( listener != null )
|
||||||
|
listener.onPage(currentPage);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !isDelayed ) //semaphore
|
||||||
|
{
|
||||||
|
isDelayed = true;
|
||||||
|
postDelayed(new Runnable()
|
||||||
|
{
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
isDelayed = false;
|
||||||
|
// animate to 1/10 of page every 10 ms
|
||||||
|
scrollBy(isInc?pageWidth/100:-pageWidth/100,0);
|
||||||
|
}
|
||||||
|
},10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add view and set layout
|
||||||
|
public void addPage(View view)
|
||||||
|
{
|
||||||
|
view.setLayoutParams(pageParams);
|
||||||
|
pageContainer.addView(view);
|
||||||
|
numPages++;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onScrollChanged(int l, int t, int oldl, int oldt)
|
||||||
|
{
|
||||||
|
// this called on every scrollTo/scrollBy and touch scroll
|
||||||
|
super.onScrollChanged(l,t,oldl,oldt);
|
||||||
|
lastScroll=l;
|
||||||
|
isInc = l>oldl;
|
||||||
|
animateScroll();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent e)
|
||||||
|
{
|
||||||
|
switch( e.getAction() )
|
||||||
|
{
|
||||||
|
case e.ACTION_DOWN:
|
||||||
|
// store swipe start
|
||||||
|
lastx = firstx = e.getX();
|
||||||
|
// animation will be started on next scroll event
|
||||||
|
anim = true;
|
||||||
|
break;
|
||||||
|
case e.ACTION_MOVE:
|
||||||
|
// animation will start in supercall, so select direction now
|
||||||
|
isInc = e.getX() < lastx;
|
||||||
|
targetPage = isInc?currentPage+1:currentPage-1;
|
||||||
|
lastx = e.getX();
|
||||||
|
break;
|
||||||
|
case e.ACTION_UP:
|
||||||
|
// detect misstouch (<100 pixels)
|
||||||
|
if( Math.abs(e.getX()-firstx) < 100)
|
||||||
|
{
|
||||||
|
anim = false;
|
||||||
|
targetPage = currentPage;
|
||||||
|
scrollTo(currentPage*pageWidth,0);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return super.onTouchEvent(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set page number
|
||||||
|
public void changePage(int page)
|
||||||
|
{
|
||||||
|
targetPage = page;
|
||||||
|
anim = true;
|
||||||
|
isInc = targetPage > currentPage;
|
||||||
|
animateScroll();
|
||||||
|
}
|
||||||
|
|
||||||
|
// call when animation ends
|
||||||
|
public void setOnPageListener(OnPageListener listener1)
|
||||||
|
{
|
||||||
|
listener = listener1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PagedView scroll;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
@ -32,6 +165,7 @@ public class XashTutorialActivity extends Activity implements View.OnClickListen
|
||||||
setContentView(R.layout.activity_tutorial);
|
setContentView(R.layout.activity_tutorial);
|
||||||
initTexts();
|
initTexts();
|
||||||
initViews();
|
initViews();
|
||||||
|
initPages();
|
||||||
changeFragment(0);
|
changeFragment(0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -44,31 +178,59 @@ public class XashTutorialActivity extends Activity implements View.OnClickListen
|
||||||
nextText = R.string.next;
|
nextText = R.string.next;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initAdapter() {
|
private void initPages() {
|
||||||
/*adapter = new StepPagerAdapter(getSupportFragmentManager(), steps);
|
LayoutInflater inflater;
|
||||||
pager.setAdapter(adapter);
|
|
||||||
pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
|
|
||||||
|
|
||||||
}
|
inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
||||||
|
LinearLayout container = (LinearLayout)findViewById(R.id.container);
|
||||||
|
|
||||||
@Override
|
DisplayMetrics metrics = new DisplayMetrics();
|
||||||
public void onPageSelected(int position) {
|
getWindowManager().getDefaultDisplay().getMetrics(metrics);
|
||||||
currentItem = position;
|
|
||||||
controlPosition(position);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
scroll = new PagedView(this,metrics.widthPixels);
|
||||||
public void onPageScrollStateChanged(int state) {
|
container.addView(scroll);
|
||||||
|
|
||||||
}
|
while( true )
|
||||||
});*/
|
{
|
||||||
|
int titleres = getResources().getIdentifier("page_title" + String.valueOf(numPages), "string", getPackageName());
|
||||||
|
|
||||||
|
if( titleres == 0 )
|
||||||
|
break;
|
||||||
|
|
||||||
|
LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.tutorial_step , null);
|
||||||
|
|
||||||
|
TextView title = (TextView) layout.findViewById(R.id.title);
|
||||||
|
TextView text = (TextView) layout.findViewById(R.id.content);
|
||||||
|
ImageView drawable = (ImageView) layout.findViewById(R.id.image);
|
||||||
|
|
||||||
|
int contentres = getResources().getIdentifier("page_content" + String.valueOf(numPages), "string", getPackageName());
|
||||||
|
int drawableres = getResources().getIdentifier("page" + String.valueOf(numPages), "drawable", getPackageName());
|
||||||
|
if( drawableres == 0)
|
||||||
|
drawableres = getResources().getIdentifier("page" + String.valueOf(numPages) + "_" + Locale.getDefault().getLanguage(), "drawable", getPackageName());
|
||||||
|
if( drawableres == 0 )
|
||||||
|
drawableres = getResources().getIdentifier("page" + String.valueOf(numPages) + "_en", "drawable", getPackageName());
|
||||||
|
|
||||||
|
title.setText(titleres);
|
||||||
|
text.setText(contentres);
|
||||||
|
drawable.setImageResource(drawableres);
|
||||||
|
scroll.addPage(layout);
|
||||||
|
numPages++;
|
||||||
|
}
|
||||||
|
scroll.setOnPageListener(new PagedView.OnPageListener(){
|
||||||
|
@Override
|
||||||
|
public void onPage(int page)
|
||||||
|
{
|
||||||
|
currentItem = page;
|
||||||
|
controlPosition();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void controlPosition( boolean last) {
|
private void controlPosition()
|
||||||
|
{
|
||||||
notifyIndicator();
|
notifyIndicator();
|
||||||
if (last) {
|
|
||||||
|
if (currentItem == numPages - 1) {
|
||||||
next.setText(finishText);
|
next.setText(finishText);
|
||||||
prev.setText(prevText);
|
prev.setText(prevText);
|
||||||
} else if ( currentItem == 0) {
|
} else if ( currentItem == 0) {
|
||||||
|
@ -83,15 +245,12 @@ public class XashTutorialActivity extends Activity implements View.OnClickListen
|
||||||
private void initViews() {
|
private void initViews() {
|
||||||
currentItem = 0;
|
currentItem = 0;
|
||||||
|
|
||||||
// pager = (ViewPager) findViewById(R.id.viewPager);
|
|
||||||
next = (Button) findViewById(R.id.next);
|
next = (Button) findViewById(R.id.next);
|
||||||
prev = (Button) findViewById(R.id.prev);
|
prev = (Button) findViewById(R.id.prev);
|
||||||
|
|
||||||
indicatorLayout = (LinearLayout) findViewById(R.id.indicatorLayout);
|
indicatorLayout = (LinearLayout) findViewById(R.id.indicatorLayout);
|
||||||
containerLayout = (FrameLayout) findViewById(R.id.containerLayout);
|
containerLayout = (FrameLayout) findViewById(R.id.containerLayout);
|
||||||
buttonContainer = (RelativeLayout) findViewById(R.id.buttonContainer);
|
buttonContainer = (RelativeLayout) findViewById(R.id.buttonContainer);
|
||||||
title = (TextView) findViewById(R.id.title);
|
|
||||||
text = (TextView) findViewById(R.id.content);
|
|
||||||
drawable = (ImageView) findViewById(R.id.image);
|
|
||||||
|
|
||||||
next.setOnClickListener(this);
|
next.setOnClickListener(this);
|
||||||
prev.setOnClickListener(this);
|
prev.setOnClickListener(this);
|
||||||
|
@ -136,50 +295,34 @@ public class XashTutorialActivity extends Activity implements View.OnClickListen
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
if (v.getId() == R.id.next) {
|
if (v.getId() == R.id.next) {
|
||||||
|
if( currentItem == numPages - 1 )
|
||||||
|
{
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
changeFragment(true);
|
changeFragment(true);
|
||||||
} else if (v.getId() == R.id.prev) {
|
} else if (v.getId() == R.id.prev) {
|
||||||
|
if( currentItem == 0 )
|
||||||
|
{
|
||||||
|
finish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
changeFragment(false);
|
changeFragment(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changeFragment(int position) {
|
private void changeFragment(int position) {
|
||||||
currentItem = position;
|
scroll.changePage(position);
|
||||||
updateStep();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changeFragment(boolean isNext) {
|
private void changeFragment(boolean isNext) {
|
||||||
if (isNext) {
|
if (isNext) {
|
||||||
currentItem++;
|
scroll.changePage(currentItem+1);
|
||||||
} else {
|
} else {
|
||||||
currentItem--;
|
scroll.changePage(currentItem-1);
|
||||||
}
|
}
|
||||||
updateStep();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void updateStep()
|
|
||||||
{
|
|
||||||
int titleres = getResources().getIdentifier("page_title" + String.valueOf(currentItem), "string", getPackageName());
|
|
||||||
|
|
||||||
if( titleres == 0 )
|
|
||||||
{
|
|
||||||
finish();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
int titlenext = getResources().getIdentifier("page_title" + String.valueOf(currentItem+1), "string", getPackageName());
|
|
||||||
int contentres = getResources().getIdentifier("page_content" + String.valueOf(currentItem), "string", getPackageName());
|
|
||||||
int drawableres = getResources().getIdentifier("page" + String.valueOf(currentItem), "drawable", getPackageName());
|
|
||||||
if( drawableres == 0)
|
|
||||||
drawableres = getResources().getIdentifier("page" + String.valueOf(currentItem) + "_" + Locale.getDefault().getLanguage(), "drawable", getPackageName());
|
|
||||||
if( drawableres == 0 )
|
|
||||||
drawableres = getResources().getIdentifier("page" + String.valueOf(currentItem) + "_en", "drawable", getPackageName());
|
|
||||||
|
|
||||||
title.setText(titleres);
|
|
||||||
text.setText(contentres);
|
|
||||||
drawable.setImageResource(drawableres);
|
|
||||||
controlPosition(titlenext == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPrevText(int text) {
|
public void setPrevText(int text) {
|
||||||
prevText = text;
|
prevText = text;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue