您的位置:首页 > 移动开发 > Android开发

android:ViewPager与FragmentPagerAdapter

2015-06-09 17:30 495 查看

关键点

ViewPager的滑动监听,自动定时滑动,滑动时间的设置。

Code

MainActivity

package net.mobctrl.viewpager;

import java.lang.reflect.Field;

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.DecelerateInterpolator;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends FragmentActivity {

private Button btnNext;
private Button btnAuto;

private ViewPager viewPager;
private TextView textView;
private ImageView imageView;

private MyViewPagerAdapter viewPagerAdapter;

private String[] fragmentTexts = { "Fragment1", "Fragment2", "Fragment3" };
private int currentPosition;

private Handler handler;

private boolean autoScroll = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnNext = (Button) findViewById(R.id.btn_next);
btnAuto = (Button) findViewById(R.id.btn_auto);
viewPager = (ViewPager) findViewById(R.id.view_pager);
imageView = (ImageView) findViewById(R.id.iv_icon);
textView = (TextView) findViewById(R.id.tv_show);

btnNext.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
nextPager();
}
});

btnAuto.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
if (autoScroll) {
autoScroll = false;
} else {
autoScroll = true;
new Thread(runable).start();
}
}
});

viewPagerAdapter = new MyViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setOnPageChangeListener(new OnPageChangeListener() {

@Override
public void onPageSelected(int position) {
currentPosition = position;
textView.setText("current:" + position);
}

@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
currentPosition = position;
imageView.setRotation(360 * positionOffset);
textView.setAlpha(Math.abs(positionOffset - 0.5f));
}

@Override
public void onPageScrollStateChanged(int state) {
/**
* SCROLL_STATE_IDLE SCROLL_STATE_DRAGGING SCROLL_STATE_SETTLING
*/
}
});

for (String text : fragmentTexts) {
viewPagerAdapter.addOneFragment(new MyFragment()
.setTextContent(text));
}

modifyScrollerDuration(viewPager);
handler = new Handler();

}

/**
* 滑动到下一个页面
*/
private void nextPager() {
currentPosition++;
viewPager.setCurrentItem(currentPosition
% (viewPagerAdapter.getCount()), true);
}

/**
* 修改滑动的时间
*
* @param mPager
*/
private void modifyScrollerDuration(ViewPager mPager) {
try {
Field mScroller;
mScroller = ViewPager.class.getDeclaredField("mScroller");
mScroller.setAccessible(true);
FixedSpeedScroller scroller = new FixedSpeedScroller(
mPager.getContext(), new DecelerateInterpolator());
mScroller.set(mPager, scroller);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}

/**
* 定时滑动
*/
public Runnable runable = new Runnable() {

@Override
public void run() {
while (autoScroll) {
handler.post(new Runnable() {

@Override
public void run() {
nextPager();
}
});
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
}


activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white" >

<LinearLayout
android:id="@+id/ll_panel"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:orientation="horizontal" >

<Button
android:id="@+id/btn_next"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="next" />

<Button
android:id="@+id/btn_auto"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="auto" />
</LinearLayout>

<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_above="@id/ll_panel"
android:layout_alignParentTop="true" >
</android.support.v4.view.ViewPager>

<TextView
android:id="@+id/tv_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="#7a000000"
android:gravity="center"
android:text="viewpage" />

<ImageView
android:id="@+id/iv_icon"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_launcher" />

</RelativeLayout>


MyViewPagerAdapter

package net.mobctrl.viewpager;

import java.util.ArrayList;
import java.util.List;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class MyViewPagerAdapter extends FragmentPagerAdapter {

private List<Fragment> fragments;

public MyViewPagerAdapter(FragmentManager fm) {
super(fm);
fragments = new ArrayList<Fragment>();
}

@Override
public Fragment getItem(int location) {
if (location < 0 || location >= fragments.size()) {
return null;
}
return fragments.get(location);
}

@Override
public int getCount() {
return fragments.size();
}

public void addOneFragment(Fragment fragment) {
fragments.add(fragment);
this.notifyDataSetChanged();
}

public void addAllFragments(List<Fragment> list) {
fragments.addAll(fragments);
this.notifyDataSetChanged();
}
}


FixedSpeedScroller

package net.mobctrl.viewpager;

import android.content.Context;
import android.view.animation.Interpolator;
import android.widget.Scroller;

public class FixedSpeedScroller extends Scroller {

private int mDuration = 800;

public FixedSpeedScroller(Context context) {
super(context);
}

public FixedSpeedScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}

public FixedSpeedScroller(Context context, Interpolator interpolator,
boolean flywheel) {
super(context, interpolator, flywheel);
}

@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
super.startScroll(startX, startY, dx, dy, mDuration);
}

@Override
public void startScroll(int startX, int startY, int dx, int dy) {
super.startScroll(startX, startY, dx, dy, mDuration);
}
}


MyFragment

package net.mobctrl.viewpager;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyFragment extends Fragment {

private TextView textView;
private String text;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_text, null);
textView = (TextView) view.findViewById(R.id.tv_content);
textView.setText(text);
return view;
}

public MyFragment setTextContent(String text) {
this.text = text;
return this;
}

}


总结

主要是解决ViewPager的几个问题:滑动过程的监听,自动滑动,自动滑动的时间修改



更多交流

Android开发联盟QQ群:272209595
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android