先上效果图:
之前用手机QQ时,一直很觉得这个窗口提示挺不错的,今天将它大概地实现了一遍。
首先是:提示窗口的三角下标是可以改变位置的,然后窗口中有很多小的item,item被点击时会显示出不同的颜色,
同时三角下标的颜色也随着改变。
然后是:提示窗口的item们会根据传入的坐标实现向上显示或向下显示。
一、对TipView定义一些成员变量
// 一些状态变量
private static final int STATUS_DOWN = 1;
private static final int STATUS_UP = 2;
// 初始窗口的Item显示在上方
private int mStatus = STATUS_UP;
// Item之间的分隔线的颜色
private int mSeparateLineColor ;
// 窗口边上两个方块的边角半径大小
private int mCorner = dip2px(6);
private Paint mPaint; // 画方块和文字的画笔
private Paint doPaint; // 画三角下标的画笔
private Path mPath; // 绘制的路径
private int mBorderMargin = dip2px(5); // 提示窗口与屏幕(根布局)的最小距离
private int mItemWidth = dip2px(50); // 窗口Item的宽度
private int mItemHeight = dip2px(48); // 窗口Item的高度
private int mTriangleTop = dip2px(50); // 三角下标的顶点
private int mHalfTriangleWidth = dip2px(6); // 三角小标的半宽
private int mItemBorder; // 三角小标与窗口Item的临界
private int realLeft; // 窗口的left值
private List<TipItem> mItemList = new ArrayList<>(); // 存储每个Item的信息
private List<Rect> mItemRectList = new ArrayList<>(); // 存储每个方块的信息
private OnItemClickListener onItemClickListener; // Item点击接口
private int choose = -1; // 是否有Item被按下,是为Item的序号,否为-1
// 外界传入的点击坐标x、y
private int x;
private int y;
二、TipView的初始化
TipView的构造方法:
public TipView(Context context, ViewGroup rootView,int x,int y,List<TipItem> mItemList) {
super(context);
this.x = x; // 设置传入过来的x轴坐标
this.y = y; // 设置传入过来的y轴坐标
// x和y决定了三角下标的位置
initPaint(); // 初始化画笔
setTipItemList(mItemList); // 初始化Item集合,并对Item的字符串长度进行处理
//【当字符串过长