下面的代碼描述了一個套索類,該類可以判斷一個點是否在用戶手指所畫的一個套索區(qū)域中:
10年積累的網(wǎng)站建設(shè)、成都網(wǎng)站制作經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有賓陽免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
/**
* a polygon represents a lasso.
*
* @author snow
*
*/
public class Lasso {
// polygon coordinates
private float[] mPolyX, mPolyY;
// number of size in polygon
private int mPolySize;
/**
* default constructor
*
* @param px
* polygon coordinates X
* @param py
* polygon coordinates Y
* @param ps
* polygon sides count
*/
public Lasso(float[] px, float[] py, int ps) {
this.mPolyX = px;
this.mPolyY = py;
this.mPolySize = ps;
}
/**
* constructor
*
* @param pointFs
* points list of the lasso
*/
public Lasso(ListPointF pointFs) {
this.mPolySize = pointFs.size();
this.mPolyX = new float[this.mPolySize];
this.mPolyY = new float[this.mPolySize];
for (int i = 0; i this.mPolySize; i++) {
this.mPolyX[i] = pointFs.get(i).x;
this.mPolyY[i] = pointFs.get(i).y;
}
Log.d("lasso", "lasso size:" + mPolySize);
}
/**
* check if this polygon contains the point.
*
* @param x
* point coordinate X
* @param y
* point coordinate Y
* @return point is in polygon flag
*/
public boolean contains(float x, float y) {
boolean result = false;
for (int i = 0, j = mPolySize - 1; i mPolySize; j = i++) {
if ((mPolyY[i] y mPolyY[j] = y)
|| (mPolyY[j] y mPolyY[i] = y)) {
if (mPolyX[i] + (y - mPolyY[i]) / (mPolyY[j] - mPolyY[i])
* (mPolyX[j] - mPolyX[i]) x) {
result = !result;
}
}
}
return result;
}
}
當(dāng)用戶手指在屏幕上劃動時,可以保存手指劃過的點用來實例化Lasso類,也可以在用戶手指抬起后通過PathMeasure類來對封閉的Path對象取點,然后實例化Lasso類。
Lasso類中的contains方法即是判斷點是否在多邊形內(nèi)
你好,Paint mField = new Paint();
mField.setAntiAlias(true);
Path mFieldPath = new Path();
mFieldPath.moveTo(X1,Y1);
mFieldPath.lineTo(X2,Y2);
mFieldPath.lineTo(X3,Y3);
mFieldPath.lineTo(X4,Y4);
mFieldPath.close();
mField.setARGB(200, 255, 215, 0);//設(shè)置封閉路徑的填充色為金
canvas.drawPath(mFieldPath, mField);
這樣繪制出來的圖形為一個金矩形,不夠美觀,因此想到使用圖片來填充
直接加上如下代碼:
Shader mShader = new BitmapShader(fieldBitmap,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);
mField.setShader(mShader);
其中,filedBitmap為指定的圖片,可以通過mFieldBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.feild);方式獲得
Android中的Path類一般用在自定義view里面(當(dāng)系統(tǒng)提供的控件不能滿足你的開發(fā)需求,需要自己寫 控件,也就是自定義view)。
path類的lineTo方法:lineTo(float x, float y) ,該方法實現(xiàn)的僅僅是兩點連成一線的繪制線路。
path類的quadTo方法:quadTo(float x1, float y1, float x2, float y2),該方法的實現(xiàn)是當(dāng)我們不僅僅是畫一條線甚至是畫弧線時會形成平滑的曲線,該曲線又稱為"貝塞爾曲線"(Bezier curve),其中,x1,y1為控制點的坐標值,x2,y2為終點的坐標值)。
主要區(qū)別(效果):對比quadTo方法繪制的線,lineTo繪制的線在彎曲部分很明顯的不能形成平滑的彎曲,會出現(xiàn)明顯的兩點形成一線的突痕。
/**
* 畫曲線(核心代碼)
*
* @param startp
* 開始點
* @param endp
* 結(jié)束點
* @param canvas
* 畫布
* @param paint
* 畫筆
*/
private void drawCurve(Point[] points, Canvas canvas, Paint paint)
{
Point startp = new Point();
Point endp = new Point();
for (int i = 0; i points.length - 1; i++)
{
startp = points[i];
endp = points[i + 1];
int wt = (startp.x + endp.x) / 2;
Point p3 = new Point();
Point p4 = new Point();
p3.y = startp.y;
p3.x = wt;
p4.y = endp.y;
p4.x = wt;
// 確定曲線的路徑
path = new Path();
path.moveTo(startp.x, startp.y);
path.cubicTo(p3.x, p3.y, p4.x, p4.y, endp.x, endp.y);
canvas.drawPath(path, paint);
}
}