Android ViewPager+View.setTranslationX實現可滑動的指示器效果

jopen 9年前發布 | 64K 次閱讀 ViewPager Android開發 移動開發

對于需求較為嚴格一些,應該讓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實現可滑動的指示器效果


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!