大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
下面的代码描述了一个套索类,该类可以判断一个点是否在用户手指所画的一个套索区域中:
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:空间域名、网站空间、营销软件、网站建设、吴堡网站维护、网站推广。
/**
* 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;
}
}
当用户手指在屏幕上划动时,可以保存手指划过的点用来实例化Lasso类,也可以在用户手指抬起后通过PathMeasure类来对封闭的Path对象取点,然后实例化Lasso类。
Lasso类中的contains方法即是判断点是否在多边形内
1. Path---quadTo(float x1, float y1, float x2, float y2):
该方法的实现是当画弧线时会形成平滑的曲线,该曲线又称为"贝塞尔曲线"(Bezier curve),其中,x1,y1为控制点的坐标值,x2,y2为终点的坐标值;
贝塞尔曲线的形成,就比如把一条橡皮筋拉直,橡皮筋的头尾部对应起点和终点,然后从拉直的橡皮筋中选择任意一点(除头尾对应的点外)扯动橡皮筋形成的弯曲形状,而那个扯动橡皮筋的点就是控制点。
2. Path---lineTo(float x, float y) :
该方法实现的仅仅是两点连成一线的绘制线路,这样,当用这个方法绘制曲线时,缺陷就出来了。对比前面quadTo方法lineTo方法绘制的曲线不能形成平滑的弯曲,会出现明显的两点形成一线的突痕。
是系统变量里的path 找到path 双击
然后加上
E:\android-sdk-windows\Tools;
就ok了
Path规划动画轨迹
public void testPathAnimator(){
final FrameLayout l = (FrameLayout) findViewById(R.id.root_view);
final ImageView imageView = new ImageView(this);
imageView.setImageResource(R.drawable.dot);
FrameLayout.LayoutParams param = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
l.addView(imageView, param);
Path path = new Path();
path.moveTo(200, 200);
path.quadTo(800, 200, 800, 800);
PathInterpolator pathInterpolator = new PathInterpolator(0.33f,0f,0.12f,1f);
AnimatorSet animSet = new AnimatorSet();
animSet.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
l.removeView(imageView);
}
@Override
public void onAnimationCancel(Animator animation) {
l.removeView(imageView);
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
ObjectAnimator scalex = ObjectAnimator.ofFloat(imageView, View.SCALE_X, 1.0f, 0.3f);
ObjectAnimator scaley = ObjectAnimator.ofFloat(imageView, View.SCALE_Y, 1.0f, 0.3f);
ObjectAnimator traslateAnimator = ObjectAnimator.ofFloat(imageView, "x", "y", path);
animSet.playTogether(scalex, scaley, traslateAnimator);
animSet.setInterpolator(pathInterpolator);
animSet.setDuration(1500);
animSet.start();
}
}
path 中比较难的应该是贝塞尔曲线相关的及与 Path 相关的类,比如 PathMeasure。
基本使用及低阶贝塞尔如下
高阶贝塞尔绘制
你好,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);//设置封闭路径的填充色为金
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);方式获得