Android ViewPager+View.setTranslationX实现可滑动的指示器效果


对于需求较为严格一些,应该让ViewPager滑动时,那个指示器也应该滑动才符合逻辑,因此如上代码改造为如下代码

public class AnimActivity extends BaseActivity {

	private View vline;

	/**
	 * 指示器偏移宽度
	 */
	private int offsetWidth = 0;
	
	private ViewPager mViewPager;
	
	/**
	 * viewPager宽度
	 */
	private int screenWith = 0;
	/**
	 * viewPager高度
	 */
	private int screeHeight = 0;
	
	private int[] drawableResIds = {R.drawable.mm_1,R.drawable.mm_2};
	
	@Override
	protected void onCreate(Bundle saveInstance) {
		super.onCreate(saveInstance);
		setContentView(R.layout.anim_layout);
		vline = findViewById(R.id.line);
		mViewPager = (ViewPager) findViewById(R.id.anim_view_pager);

		screenWith = getWindow().getWindowManager().getDefaultDisplay().getWidth();
		screeHeight = getWindow().getWindowManager().getDefaultDisplay().getHeight()-dip2px(this, 45);
		//这里之所以是45,请查看布局文件,其中ViewPager以上的节点的高度总和为45
		
		LayoutParams lp = vline.getLayoutParams();
		offsetWidth = lp.width = screenWith / 2;
		vline.setLayoutParams(lp);
		vline.setTag("0");
		
		mViewPager.setOnPageChangeListener(pageChangedListener);
		mViewPager.setAdapter(new ViewPagerAdapter());
		
	}
	
	private  OnPageChangeListener  pageChangedListener = new OnPageChangeListener() {
		
		private boolean isAnim = false;
		private int pos = 0;
		
		@Override
		public void onPageSelected(int position) 
		{
			Log.e("ViewPager", "position===>"+position);
			vline.setTranslationX(position*offsetWidth);
			pos = position;
		}
		
		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
			Log.d("ViewPager", "arg0="+arg0+"  arg1="+arg1+"   arg2="+arg2);
			if(isAnim && arg1!=0)
			{
			   vline.setTranslationX(offsetWidth*arg1);
			}
		}
		
		@Override
		public void onPageScrollStateChanged(int arg0) 
		{
			Log.i("ViewPager", "=====>arg0="+arg0);
			if(arg0==1) //开始状态
			{
				isAnim  = true;
			}
			else if(arg0==2) //分界状态
			{
				isAnim = false;
				vline.setTranslationX(pos*offsetWidth);
			}
			else if(arg0==0) //结束状态
			{
				vline.setTranslationX(pos*offsetWidth);
			}
		}
		
	};

	private class ViewPagerAdapter extends PagerAdapter
	{
		
		@Override
		public int getCount() {
			return drawableResIds.length;
		}
		@Override
		public Object instantiateItem(ViewGroup container, int position)
		{
			ImageView imageView = (ImageView) layoutInflater.inflate(R.layout.image_display, null);
			imageView.setImageBitmap(adjustBitmapSimpleSize(drawableResIds[position]));
			imageView.setTag(position);
			container.addView(imageView);
		
                        return imageView;  
		}
		
		@Override
		public void destroyItem(ViewGroup container, int position, Object object)
		{
			ImageView image = (ImageView)((ViewPager) container).findViewWithTag(position);
                        ((ViewPager) container).removeView(image);  
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) 
		{
			return arg0==arg1;
		}
		
	}
	
	/**
	 * 调整压缩采样率
	 * @param resId
	 * @return
	 */
	private Bitmap adjustBitmapSimpleSize(int resId)
	{
		BitmapFactory.Options opts = new BitmapFactory.Options();
		opts.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resId, opts);
		int visibleHeight = screeHeight;
		int visibleWidth = screenWith;
		if(opts.outWidth>visibleWidth ||opts.outHeight>visibleHeight)
		{
			float wRatio =  opts.outWidth/visibleWidth;
			float hRatio =  opts.outHeight/visibleHeight;
			opts.inSampleSize = (int) Math.max(wRatio, hRatio);
		}
		opts.inJustDecodeBounds = false;
		bitmap.recycle();
		return BitmapFactory.decodeResource(getResources(),resId, opts);
	}
	
	public void doSwicth(View v) {
		switch (v.getId()) 
		{
			case R.id.fade_anim_left: 
			{
				mViewPager.setCurrentItem(0,true);
			}
				break;
			case R.id.fade_anim_right:
				mViewPager.setCurrentItem(1,true);
				break;
		
			default:
				break;
		}
	}

	
	  /** 
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素) 
     */  
    public static int dip2px(Context context, float dpValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (dpValue * scale + 0.5f);  
    }  
  
    /** 
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp 
     */  
    public static int px2dip(Context context, float pxValue) {  
        final float scale = context.getResources().getDisplayMetrics().density;  
        return (int) (pxValue / scale + 0.5f);  
    }  
}

布局文件:anim_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<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="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >
         <Button
	        android:id="@+id/fade_anim_left"
	        android:layout_width="match_parent"
	        android:layout_height="40dip"
	        android:layout_weight="1"
	        android:text="Left" 
	        android:onClick="doSwicth"
	        android:background="@drawable/fade_anim"
        />
         <View 
             android:layout_width="1dip"
             android:layout_height="30dip"
             android:background="@color/red"
             />
          <Button
             
	        android:id="@+id/fade_anim_right"
	        android:layout_width="match_parent"
	        android:layout_height="40dip"
	        android:text="Right" 
	        android:layout_weight="1"
	        android:onClick="doSwicth"
	        android:background="@drawable/fade_anim"
        />
    </LinearLayout>
    
    <View 
        android:id="@+id/line"
        android:layout_width="160dip"
        android:layout_height="5dip"
        android:background="@color/red"
        />

    
    <android.support.v4.view.ViewPager
        android:id="@+id/anim_view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical"
        android:keepScreenOn="true"
        >
          <!-- <android.support.v4.view.PagerTabStrip    
            android:id="@+id/anim_view_pager_tabsctrip"    
            android:layout_width="wrap_content"    
            android:layout_height="wrap_content"    
            android:layout_gravity="top"/>    -->
    </android.support.v4.view.ViewPager>

</LinearLayout>


image_display.xml

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:scaleType="centerCrop"
    android:layout_height="match_parent" >

</ImageView>

Tab按钮渐变背景


<?xml version="1.0" encoding="utf-8"?>
<selector 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:enterFadeDuration="0"
    android:exitFadeDuration="300"
    android:visible="true"
    
     >
    <item  android:state_pressed="false" android:state_focused="false" android:drawable="@color/white" />
	<item android:state_pressed="true" android:drawable="@color/red"/>
	<item android:state_focused="true" android:drawable="@color/red"/>
</selector>

运行如下:

Android ViewPager+View.setTranslationX实现可滑动的指示器效果    Android ViewPager+View.setTranslationX实现可滑动的指示器效果 

   Android ViewPager+View.setTranslationX实现可滑动的指示器效果    Android ViewPager+View.setTranslationX实现可滑动的指示器效果


你可能感兴趣的:(Android ViewPager+View.setTranslationX实现可滑动的指示器效果)