前段時(shí)間因?yàn)楣ぷ鞯男枨螅芯苛艘幌伦远xView的一些相關(guān)繪制方法博敬,要求在指定區(qū)域內(nèi)繪制多個(gè)矩形,并且矩形之前不重疊峰尝,效果圖如下
image
數(shù)據(jù)是由后臺(tái)返回的偏窝,給出了具體的橫坐標(biāo),然后去計(jì)算縱坐標(biāo)武学,這里我抽出來(lái)相關(guān)的核心算法代碼祭往,分享一下
/ **
在固定區(qū)域繪制多個(gè)標(biāo)簽,已知標(biāo)簽的左上角X坐標(biāo)劳淆,寬链沼,高,求解每個(gè)標(biāo)簽的最優(yōu)的左上角?坐標(biāo)
* /
{
int centerY = mMainRect.Height()/ 2; //繪制區(qū)域中心點(diǎn)Y.
int centerX = mMainRect.Width()/ 2; //繪制區(qū)域中心點(diǎn)X.
int maxH = mMainRect.Height() - 10;
int minH = 0;
int offsetY = 20; //建議標(biāo)簽到分時(shí)圖上的點(diǎn)的最佳偏移量
int marginY = 2; //每個(gè)標(biāo)簽Y軸坐標(biāo)最小間距
int顏色;
int lineColor;
int padding = 10;
List <MarketChangeBean> labelArr = new ArrayList <>();
for(MarketChangeBean bean:mBigChangeBeans){
int y = 0;
CRect cRect = graphics.getBounds(bean.getPlateName());
CRect plateRect = new CRect(cRect.mLeft沛鸵,cRect.mTop括勺,cRect.mRight + padding,cRect.mBottom + padding);
boolean isLeft = bean.getxPos()<centerX; //是否在X中軸左側(cè)曲掰,在左側(cè)的話繪制時(shí)相對(duì)分時(shí)上的點(diǎn)朝右疾捍,右側(cè)時(shí)繪制時(shí)相對(duì)分時(shí)上的點(diǎn)朝左
bean.setPointX(isLeft?bean.getxPos():( bean.getxPos() - plateRect.Width())); //調(diào)整標(biāo)簽左上角x坐標(biāo)
int dotY = bean.getDotY();
if(dotY <centerY){
//分時(shí)上的點(diǎn)位于?中軸上方栏妖,標(biāo)簽優(yōu)先繪制在?中軸下方
//判斷最佳位置是否與其他標(biāo)簽相交
{
boolean bl = false;
CRect r1 = new CRect(bean.getPointX()乱豆,dotY + offsetY,bean.getPointX()+ plateRect.Width()吊趾,dotY + offsetY + plateRect.Height());
for(MarketChangeBean labelBean:labelArr){
CRect cR = graphics.getBounds(labelBean.getPlateName());
CRect lastRect = new CRect(cR.mLeft宛裕,cR.mTop瑟啃,cR.mRight + padding,cR.mBottom + 10);
CRect r2 = new CRect(labelBean.getPointX()揩尸,labelBean.getPointY()蛹屿,labelBean.getPointX()+ lastRect.Width(),labelBean.getPointY()+ lastRect.Height());
if(isIntersect(r1岩榆,r2)){//表示沒(méi)有交集
bl = true;
打破;
}
}
if(错负!bl){//最佳位置與其他標(biāo)簽沒(méi)相交
bean.setPointY(dotY + offsetY);
bean.setLineY(dotY + offsetY + r1.Height());
labelArr.add(豆); //將已繪制的標(biāo)簽添加到集合當(dāng)中
繼續(xù);
}
}
//最佳位置與其他標(biāo)簽相交,開(kāi)始計(jì)算?
y = maxH;
boolean intersect = false;
做{
y - =(plateRect.Height()+ marginY);
if(y <= 0){
intersect = false;
打破;
}
//判斷最佳位置是否與其他標(biāo)簽相交
CRect r1 = new CRect(bean.getPointX()勇边,y犹撒,bean.getPointX()+ plateRect.Width(),y + offsetY);
for(MarketChangeBean labelBean:labelArr){
CRect cR = graphics.getBounds(labelBean.getPlateName());
CRect lastRect = new CRect(cR.mLeft粒褒,cR.mTop识颊,cR.mRight + padding,cR.mBottom + 10);
CRect r2 = new CRect(labelBean.getPointX()怀浆,labelBean.getPointY()谊囚,labelBean.getPointX()+ lastRect.Width(),labelBean.getPointY()+ lastRect.Height());
if(isIntersect(r1执赡,r2)){
intersect = true;
打破;
} else {
intersect = false;
}
}
而(相交);
if(y <= 0){
//沒(méi)位置繪制
y =(int)(Math.random()*(maxH - plateRect.Height()));
}
bean.setPointY(Y);
bean.setLineY(y <centerY镰踏?y:y + plateRect.Height());
labelArr.add(豆); //將已繪制的標(biāo)簽添加到集合當(dāng)中
} else {
//分時(shí)上的點(diǎn)位于?中軸下方,標(biāo)簽優(yōu)先繪制在?中軸上方
//判斷最佳位置是否與其他標(biāo)簽相交
{
boolean bl = false;
CRect r1 = new CRect(bean.getPointX()沙合,dotY - offsetY - plateRect.Height()奠伪,bean.getPointX()+ plateRect.Width(),dotY - offsetY);
for(MarketChangeBean labelBean:labelArr){
CRect cR = graphics.getBounds(labelBean.getPlateName());
CRect lastRect = new CRect(cR.mLeft首懈,cR.mTop绊率,cR.mRight + padding,cR.mBottom + 10);
CRect r2 = new CRect(labelBean.getPointX()究履,labelBean.getPointY()滤否,labelBean.getPointX()+ lastRect.Width(),labelBean.getPointY()+ lastRect.Height());
if(isIntersect(r1最仑,r2)){
bl = true;
打破;
}
}
if(藐俺!bl){
//最佳位置與其他標(biāo)簽沒(méi)相交
bean.setPointY(dotY - offsetY - plateRect.Height());
bean.setLineY(dotY - offsetY - plateRect.Height());
labelArr.add(豆); //將已繪制的標(biāo)簽添加到集合當(dāng)中
繼續(xù);
}
}
//最佳位置與其他標(biāo)簽相交,開(kāi)始計(jì)算?
y = minH;
boolean intersect = false;
做{
y + =(plateRect.Height()+ marginY);
if(y> = maxH - plateRect.Height()){
intersect = false;
打破;
}
CRect r1 = new CRect(bean.getPointX()泥彤,y欲芹,bean.getPointX()+ plateRect.Width(),y + offsetY);
for(MarketChangeBean labelBean:labelArr){
CRect cR = graphics.getBounds(labelBean.getPlateName());
CRect lastRect = new CRect(cR.mLeft吟吝,cR.mTop菱父,cR.mRight + padding,cR.mBottom + 10);
CRect r2 = new CRect(labelBean.getPointX(),labelBean.getPointY()浙宜,labelBean.getPointX()+ lastRect.Width()官辽,labelBean.getPointY()+ lastRect.Height());
if(isIntersect(r1,r2)){
intersect = true;
打破;
} else {
intersect = false;
}
}
而(相交);
if(y> = maxH - plateRect.Height()){
//沒(méi)位置繪制粟瞬,隨機(jī)一個(gè)?值
y =(int)(Math.random()*(maxH - plateRect.Height()));
}
bean.setPointY(Y);
bean.setLineY(Y);
labelArr.add(豆);
}
}}