viewpager+fragment附带导航条跟随手指晃动改变位置

如果不能看

请看这个

效果图

直接上代码

package com.qiao.viewpageranimation;

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

import com.qiao.Fragment.FragmentOne;
import com.qiao.Fragment.FragmentThr;
import com.qiao.Fragment.FragmentTwo;


import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
 * viewpager+fragment侧滑+导航条动画
 * @author 有点凉了
 * QQ群:123869487
 * 求基友共同进步,求大神入群指点
 * -----------------------------
 * 被注释掉的方法是页面滑动后的移动效果
 */
public class MainActivity extends FragmentActivity {
	private static final String TAG="MainActivity";
	private ImageView cusor;
	private int bmpW;// 动画图片宽度
	private int offset = 0;// 动画图片偏移量
	private List<Fragment> list = null;//
	
	private TextView textView_one,textView_two,textView_thr;
	
	
	private ViewPager mPager;
	private int currIndex = 0;// 当前页卡编号
	
    /**
     * ViewPager的当前选中页
     */
    private int currentIndex;
    /**
     * 屏幕的宽度
     */
    private int screenWidth;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findById();
		init();
		initTabLineWidth();
		
//		普通的动画移动
//		InitImageView();
//		InitTextView();
//		InitViewPager();
	}

	   /**
     * 重置颜色
     */
    private void resetTextView() {
    	textView_one.setTextColor(Color.BLACK);
    	textView_two.setTextColor(Color.BLACK);
    	textView_thr.setTextColor(Color.BLACK);
    }
	private void initTabLineWidth() {
		   DisplayMetrics dpMetrics = new DisplayMetrics();
	        getWindow().getWindowManager().getDefaultDisplay()
	                .getMetrics(dpMetrics);
	        screenWidth = dpMetrics.widthPixels;
	        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) cusor
	                .getLayoutParams();
	        lp.width = screenWidth / 3;
//	        Log.i(TAG, "==lp.width:="+lp.width);
	        cusor.setLayoutParams(lp);
	        
	}

	private void init() {
		list = new ArrayList<Fragment>();
		FragmentOne fragmentOne = new FragmentOne();
		list.add(fragmentOne);
		FragmentTwo fragmentTwo = new FragmentTwo();
		list.add(fragmentTwo);
		FragmentThr fragmentThr = new FragmentThr();
		list.add(fragmentThr);
		mPager.setAdapter(new MyAdapter(getSupportFragmentManager(),list));
		mPager.setCurrentItem(0);
		mPager.setOnPageChangeListener(new OnPageChangeListener() {
			
			@Override
			public void onPageSelected(int position) {
				// TODO Auto-generated method stub
				resetTextView();
				switch (position) {
				case 0:
					textView_one.setTextColor(Color.BLUE);
					break;
				case 1:
					textView_two.setTextColor(Color.BLUE);
					break;
				case 2:
					textView_thr.setTextColor(Color.BLUE);
					break;

				default:
					break;
				}
				currentIndex = position;
			}
			
			 /**
             * position :当前页面,及你点击滑动的页面 offset:当前页面偏移的百分比
             * offsetPixels:当前页面偏移的像素位置
             */
			@Override
			public void onPageScrolled(int position, float offset, int offsetPixels) {
				// TODO Auto-generated method stub
				 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) cusor
	                        .getLayoutParams();
	 
//				 Log.i(TAG, "==offset:="+offset);
	                /**
	                 * 利用currentIndex(当前所在页面)和position(下一个页面)以及offset来
	                 * 设置mTabLineIv的左边距 滑动场景:
	                 * 记3个页面,
	                 * 从左到右分别为0,1,2 
	                 * 0->1; 1->2; 2->1; 1->0
	                 */
	 
				 
				 Log.i(TAG, "==-->currentIndex:="+currentIndex+"  position:="+position );
				if (currentIndex == 0 && position == 0)// 0->1
				{
					lp.leftMargin = (int) (offset * (screenWidth * 1.0 / 3) + currentIndex
							* (screenWidth / 3));
					Log.i(TAG, "==走了0——>1:="+lp.leftMargin);

				} else if (currentIndex == 1 && position == 0) // 1->0
				{
					lp.leftMargin = (int) (-(1 - offset) * (screenWidth * 1.0 / 3) + currentIndex * (screenWidth / 3));

					Log.i(TAG, "==走了 1->0:="+lp.leftMargin);

				} else if (currentIndex == 1 && position == 1) // 1->2
				{
					lp.leftMargin = (int) (offset * (screenWidth * 1.0 / 3) + currentIndex
							* (screenWidth / 3));
					Log.i(TAG, "==走了1->2");
					// Log.i(TAG, "==lp.leftMargin:=  1->2:="+lp.leftMargin);
				} else if (currentIndex == 2 && position == 1) // 2->1
				{
					lp.leftMargin = (int) (-(1 - offset) * (screenWidth * 1.0 / 3) + currentIndex * (screenWidth / 3));
					Log.i(TAG, "==走了2->1");
				}
	                cusor.setLayoutParams(lp);
			}
			 /**
             * state滑动中的状态 有三种状态(0,1,2) 1:正在滑动 2:滑动完毕 0:什么都没做。
             */
			@Override
			public void onPageScrollStateChanged(int state) {
				// TODO Auto-generated method stub
				
			}
		});
	}

	private void findById() {
		// TODO Auto-generated method stub
		mPager = (ViewPager) findViewById(R.id.viewPager);
		cusor = (ImageView) findViewById(R.id.cusor);
		textView_one = (TextView) findViewById(R.id.textView_one);
		textView_two = (TextView) findViewById(R.id.textView_two);
		textView_thr = (TextView) findViewById(R.id.textView_thr);
	}

/*	private void InitViewPager() {
		mPager = (ViewPager) findViewById(R.id.viewPager);
		list = new ArrayList<Fragment>();
		FragmentOne fragmentOne = new FragmentOne();
		list.add(fragmentOne);
		FragmentTwo fragmentTwo = new FragmentTwo();
		list.add(fragmentTwo);
		FragmentThr fragmentThr = new FragmentThr();
		list.add(fragmentThr);
		mPager.setAdapter(new MyAdapter(getSupportFragmentManager(),list));
		mPager.setCurrentItem(0);
		mPager.setOnPageChangeListener(new MyOnPageChangeListener());
	}*/

/*	private void InitTextView() {
		textView_one = (TextView) findViewById(R.id.textView_one);
		textView_two = (TextView) findViewById(R.id.textView_two);
		textView_thr = (TextView) findViewById(R.id.textView_thr);
		textView_one.setOnClickListener(new MyOnClickListener(0));
		textView_two.setOnClickListener(new MyOnClickListener(1));
		textView_thr.setOnClickListener(new MyOnClickListener(2));
	}*/

/*	private void InitImageView() {
		
		bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.dotx11)
				.getWidth();// 获取图片宽度
		DisplayMetrics dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		int screenW = dm.widthPixels;// 获取分辨率宽度
		offset = (screenW / 3 - bmpW) / 2;// 计算偏移量
		Matrix matrix = new Matrix();
		matrix.postTranslate(offset, 0);
		cusor.setImageMatrix(matrix);// 设置动画初始位置
	}*/

	
/*	*//**
	 * 头标点击监听
	 *//*
	public class MyOnClickListener implements View.OnClickListener {
		private int index = 0;

		public MyOnClickListener(int i) {
			index = i;
		}

		@Override
		public void onClick(View v) {
			mPager.setCurrentItem(index);
		}
	};*/
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

/*	*//**
	 * 页卡切换监听
	 *//*
	public class MyOnPageChangeListener implements OnPageChangeListener {

		int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量
		int two = one * 2;// 页卡1 -> 页卡3 偏移量

		@Override
		public void onPageSelected(int arg0) {
			Animation animation = null;
			switch (arg0) {
			case 0:
				if (currIndex == 1) {
					animation = new TranslateAnimation(one, 0, 0, 0);
				} else if (currIndex == 2) {
					animation = new TranslateAnimation(two, 0, 0, 0);
				}
				break;
			case 1:
				if (currIndex == 0) {
					animation = new TranslateAnimation(offset, one, 0, 0);
				} else if (currIndex == 2) {
					animation = new TranslateAnimation(two, one, 0, 0);
				}
				break;
			case 2:
				if (currIndex == 0) {
					animation = new TranslateAnimation(offset, two, 0, 0);
				} else if (currIndex == 1) {
					animation = new TranslateAnimation(one, two, 0, 0);
				}
				break;
			}
			currIndex = arg0;
			animation.setFillAfter(true);// True:图片停在动画结束位置
			animation.setDuration(300);
			cusor.startAnimation(animation);
		}

		 *//**
         * position :当前页面,及你点击滑动的页面 offset:当前页面偏移的百分比
         * offsetPixels:当前页面偏移的像素位置
         *//*
		@Override
		public void onPageScrolled(int position, float offset, int offsetPixels) {
			 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) cusor
                     .getLayoutParams();
			 if (currentIndex == 0 && position == 0)// 0->1
             {
                 lp.leftMargin = (int) (offset * (screenWidth * 1.0 / 3) + currentIndex
                         * (screenWidth / 3));

             } else if (currentIndex == 1 && position == 0) // 1->0
             {
                 lp.leftMargin = (int) (-(1 - offset)
                         * (screenWidth * 1.0 / 3) + currentIndex
                         * (screenWidth / 3));

             } else if (currentIndex == 1 && position == 1) // 1->2
             {
                 lp.leftMargin = (int) (offset * (screenWidth * 1.0 / 3) + currentIndex
                         * (screenWidth / 3));
             } else if (currentIndex == 2 && position == 1) // 2->1
             {
                 lp.leftMargin = (int) (-(1 - offset)
                         * (screenWidth * 1.0 / 3) + currentIndex
                         * (screenWidth / 3));
             }
             cusor.setLayoutParams(lp);
		}

		@Override
		public void onPageScrollStateChanged(int arg0) {
		}
	}*/
	
	
	
	class MyAdapter extends FragmentPagerAdapter {
		private List<Fragment> list = null;

		public MyAdapter(FragmentManager fm, List<Fragment> list) {
			super(fm);
			this.list = list;
		}

		@Override
		public Fragment getItem(int arg0) {
			// TODO Auto-generated method stub
			return list.get(arg0);
		}

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return list.size();
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			// TODO Auto-generated method stub
			super.destroyItem(container, position, object);
		}
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle action bar item clicks here. The action bar will
		// automatically handle clicks on the Home/Up button, so long
		// as you specify a parent activity in AndroidManifest.xml.
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}



}

关键性的

demo地址  

砍掉侧边就行 单独的demo源码丢了,这也没差多少,,,注释几行代码就是标题所示了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有时有晌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值