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