[Android]最省内存的ViewPager添加小圆点指示器

本文介绍了一种使用自定义绘制的方式实现ViewPager指示器的方法。通过继承ViewPager并重写draw方法,利用Canvas绘制圆点指示器,实现了高效且易于移植的效果。文章提供了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理:

这个你可以用View叠加来实现,但是这个效果不太理想,1占内存,而移植起来不方便,需要找各种资源,所以采用自己绘制更好,方便,而且效率高。

解决方案:

package com.youtu.view;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;

public class ADView extends ViewPager {

	AdAdapter mAdAdapter;
	Context context;
	Paint paint;
	List<Map<String, String>> urls;

	public ADView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		paint = new Paint();
		InitAdapter();
	}

	private void InitAdapter() {
		urls = new ArrayList<Map<String, String>>();
		mAdAdapter = new AdAdapter(context, urls);
		this.setAdapter(mAdAdapter);
	}

	public void setData(List<Map<String, String>> data) {
		urls.clear();
		for (int i = 0; i < data.size(); i++) {
			urls.add(data.get(i));
		}
		if(urls.size()>0){
			this.setVisibility(View.VISIBLE);
		}else{
			this.setVisibility(View.GONE);
		}
		mAdAdapter.notifyDataSetChanged();
	}

	@Override
	public void draw(Canvas canvas) {
		super.draw(canvas);
		drawCycle(canvas);
	}

	private void drawCycle(Canvas canvas) {
		canvas.save();
		canvas.translate(getScrollX(), getScrollY());
		int count = 0;
		if (this.getAdapter() != null) {
			count = this.getAdapter().getCount();
		}
		int select = getCurrentItem();
		float density = getContext().getResources().getDisplayMetrics().density;
		int itemWidth = (int) (11 * density);
		int itemHeight = itemWidth / 2;
		int x = (getWidth() - count * itemWidth)/2;
		int y = getHeight() - itemWidth;
		int minItemHeight = (int) ((float) itemHeight * 0.8F);
		paint.setAntiAlias(true);

		paint.setStyle(Style.FILL);
		for (int i = 0; i < count; i++) {
			if (select == i) {
				paint.setColor(0xFFbdbdbd);
				canvas.drawCircle(x + itemWidth * i + itemWidth / 2, y, minItemHeight, paint);
			} else {
				paint.setColor(0xFFe6e6e6);
				canvas.drawCircle(x + itemWidth * i + itemWidth / 2, y, minItemHeight, paint);
			}
		}
		canvas.restore();
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值