自定义ViewPager,广告条目可点击和广告图片宽高自适应。


       前言:这是我第一次写博客,一直想写博客,但下不定决心。刚好今天下午很闲,想写一篇博客,从此开启我写博客的生涯。

       

   场景:在安卓项目开发中首页大部分会有一个广告或活动图片的轮番图。技术上会用到ViewPager这个控件,但viewPager自身没有一个像ListView和GridView的条目监听器来执行点击广告条目事件,而且如果后台很扯的话给你的广告图片宽高比不固定,前端自己要使ViewPager加载图片时根据图片自适应,才不会使图片失真。

 

      这样我们要自定义一个继承ViewPager的类具有以下功能:

      1.点击广告图片时,可以知道是第几张图片,并执行点击事件的监听。

      2.ViewPager的宽充满屏幕,高根据图片的宽高比自动生成。


public class MyViewPager extends ViewPager {

	public MyViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public MyViewPager(Context context) {
		super(context);
	}


	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int height = 0;
		int with=0;
		float scale=1;
		//下面遍历所有child的高度,获得子控件的最大宽和高
		for (int i = 0; i < getChildCount(); i++) {
			View child = getChildAt(i);
                        //自己测量宽高
			child.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
					MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
			int h = child.getMeasuredHeight();
			int w=child.getMeasuredWidth();
			if(w>with)//采用最大的view的宽度
				with=w;
			if (h>height) //采用最大的view的高度。
				height = h;
		}
		
		if(with>0){
                        //获得屏幕的宽度
			int dWidth=DeviceUtils.getDeviceWindowWith(getContext());
                        //得到屏幕宽和图片宽的比例
			scale=(float)dWidth/(float)with;
                        //根据上边的比例来求出ViewPager应该有的高度
			heightMeasureSpec=MeasureSpec.makeMeasureSpec((int)(height*scale),
					MeasureSpec.EXACTLY);
                        //ViewPager的宽为屏幕的宽度
			widthMeasureSpec=MeasureSpec.makeMeasureSpec(dWidth,
					MeasureSpec.EXACTLY);
		}
                
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}

	private int downx;
	private int downy;
	private long startTime;
	private long endTime;
	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		//自定义点击事件
		switch (ev.getAction()) {
		case MotionEvent.ACTION_DOWN:
			startTime=SystemClock.uptimeMillis();
			downx=(int) ev.getX();
			downy=(int) ev.getY();
			break;
		case MotionEvent.ACTION_MOVE:
			break;
		case MotionEvent.ACTION_UP:
			endTime=SystemClock.uptimeMillis();
			int touchx=(int) ev.getX()-downx;
			int touchy=(int) ev.getY()-downy;
                        //500毫秒内触摸屏幕的像素不大于20则认为是点击
			if(Math.sqrt(touchx*touchx+touchy*touchy)<20&&(endTime-startTime)<500){
				//处理点击事件
				if(listener!=null){
					listener.onclick(getCurrentItem());
				}
			}
			break;

		}
		return super.onTouchEvent(ev);
	}

        //条目点击监听器接口
	public interface MItemOnclickListener{
		public void onclick(int position);
	}

	private MItemOnclickListener listener;
        //设置条目点击监听器
	public void setOnItemClickListener(MItemOnclickListener listener){
		this.listener=listener;
	}

}



 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值