博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android View.setTranslationX实现可滑动的指示器
阅读量:6822 次
发布时间:2019-06-26

本文共 4503 字,大约阅读时间需要 15 分钟。

hot3.png

对于需求较为严格一些,应该让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

        
         
         
          
            
        
          
    

image_display.xml

Tab按钮渐变背景

    

运行如下:

183027_MRPB_2256215.png    183027_SkWw_2256215.png 

   183028_ggr6_2256215.png    183029_hLEa_2256215.png

转载于:https://my.oschina.net/ososchina/blog/355794

你可能感兴趣的文章
SharePoint中计算值公式函数简介
查看>>
实施行政审批流程系统程组件的经验总结,规范化电子化流程管理(有点儿长,准备好茶叶)...
查看>>
Ubuntu 全球 CDN 更新源
查看>>
VMbox复制虚拟机后网卡问题-bring up interface eth0:Device eth0 does not seem to be present
查看>>
UC browser对CSS的支持小结——手机网站CSS小结
查看>>
win7安装laravel
查看>>
Oracle 各后台进程功能说明
查看>>
屏蔽storm ui的kill功能
查看>>
我的友情链接
查看>>
Oracle Decode函数的使用
查看>>
MSF学习笔记
查看>>
经典脚本案例--check memory
查看>>
20.31 expect脚本同步文件;20.32 expect脚本指定host和要同步的文件;20.33 构建文件分发系统;20.34...
查看>>
CentOS单用户与救援模式
查看>>
华为交换机配置手工负载分担模式链路聚合LACP示例
查看>>
Django QuerySet API
查看>>
win 7 升级为IE11后打开IE后无反应解决办法
查看>>
rest 特征和优点
查看>>
postfix 源码centos7上搭建及错误提示---亲测
查看>>
drawable自定义字体颜色
查看>>