用到的知识:
1.Fragment与FragmentPagerAdapter结合使用
2.ViewPager滑动事件
2.drawable资源的使用
3.屏幕宽度的获取
4.Matrix的使用
5.位移动画的使用
package com.xspacing.viewpagerindicator;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
/**
*
* @ClassName MainActivity.java
* @Description TODO 指示器
* @author Smile
* @version v1.0
* @date 2016年9月27日 下午4:16:30
*/
public class MainActivity extends FragmentActivity implements OnPageChangeListener {
private static final String TAG = "MainActivity";
private TextView mTvMusic;
private TextView mTvMovie;
private TextView mTvGame;
private ViewPager mViewPager;
private ImageView mIvIndicator;
private int offset;// 指示器初始偏移量
private int indicatorWidth;// 指示器的宽度
private int screenWidth; // 屏幕的宽度
private List<Fragment> mList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
initDatas();
}
private void initViews() {
mTvMusic = (TextView) findViewById(R.id.main_tv_title_music);
mTvMovie = (TextView) findViewById(R.id.main_tv_title_movie);
mTvGame = (TextView) findViewById(R.id.main_tv_title_game);
mIvIndicator = (ImageView) findViewById(R.id.main_iv_indicator);
mViewPager = (ViewPager) findViewById(R.id.main_vp_show);
mTvMusic.setOnClickListener(new MyOnClickListener(0));
mTvMovie.setOnClickListener(new MyOnClickListener(1));
mTvGame.setOnClickListener(new MyOnClickListener(2));
mList = new ArrayList<Fragment>();
mList.add(new FragmentMusic());
mList.add(new FragmentMovie());
mList.add(new FragmentGame());
mViewPager.setAdapter(new FragmentAdapter(getSupportFragmentManager(), mList));
mViewPager.setCurrentItem(0);
mViewPager.addOnPageChangeListener(this);
}
private void initDatas() {
// 获取指示器图片的宽度
indicatorWidth = BitmapFactory.decodeResource(getResources(), R.drawable.indicator).getWidth();
DisplayMetrics dm = new DisplayMetrics(); // 获取屏幕参数对象
getWindowManager().getDefaultDisplay().getMetrics(dm); // 获取当前手机屏幕宽度
// 屏幕宽度
screenWidth = dm.widthPixels;
// 指示器初始偏移量的计算
offset = (screenWidth / mList.size() - indicatorWidth) / 2;
Matrix ma = new Matrix();
ma.postTranslate(offset, 0);
//设置指示器偏移
mIvIndicator.setImageMatrix(ma);
}
private class MyOnClickListener implements OnClickListener {
private int index;
public MyOnClickListener(int index) {
this.index = index;
}
@Override
public void onClick(View v) {
mViewPager.setCurrentItem(index);
}
}
@Override
public void onPageScrollStateChanged(int position) {
}
@Override
public void onPageScrolled(int position, float off, int arg2) {
// 创建平移动画
int one = screenWidth / mList.size();
//设置动画随着偏移改变而改变
TranslateAnimation anim = new TranslateAnimation(one * off + one * position, position * one+one * off, 0, 0);
anim.setDuration(300);
anim.setFillAfter(true);// 停留在动画结束的位置
mIvIndicator.startAnimation(anim);
}
@Override
public void onPageSelected(int position) {
}
}
package com.xspacing.viewpagerindicator;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.view.View;
public class FragmentAdapter extends FragmentPagerAdapter {
List<Fragment> mList;
public FragmentAdapter(FragmentManager fm) {
super(fm);
}
public FragmentAdapter(FragmentManager fm, List<Fragment> mList) {
super(fm);
this.mList = mList;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Fragment getItem(int position) {
return mList.get(position);
}
}
package com.xspacing.viewpagerindicator;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentGame extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_game, container, false);
}
}
package com.xspacing.viewpagerindicator;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentMovie extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_movie, container, false);
}
}
package com.xspacing.viewpagerindicator;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragmentMusic extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_music, container, false);
}
}
activity_main.xml
<LinearLayout 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:orientation="vertical"
tools:context="com.xspacing.viewpagerindicator.MainActivity" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#44ff0000" >
<TextView
android:id="@+id/main_tv_title_music"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="10dp"
android:text="音乐"
android:textSize="20sp" />
<TextView
android:id="@+id/main_tv_title_movie"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="10dp"
android:text="电影"
android:textSize="20sp" />
<TextView
android:id="@+id/main_tv_title_game"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:padding="10dp"
android:text="游戏"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#44ff0000" >
<ImageView
android:id="@+id/main_iv_indicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="matrix"
android:src="@drawable/indicator" />
</LinearLayout>
<android.support.v4.view.ViewPager
android:id="@+id/main_vp_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#aaa" >
</android.support.v4.view.ViewPager>
</LinearLayout>
fragment_game.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="Game" />
</RelativeLayout>
其他两个fragment布局与以上相同