如何在Android中用手画一条箭头?

如何在Android中用手画一条箭头?,android,math,draw,Android,Math,Draw,我需要在一条由许多点定义的直线上画一个箭头,用户将绘制该箭头 我希望我能弄清楚我的问题是什么 谢谢 注意:我在这里看到的所有问题/答案都是为了解决一条线的问题,该线由两个点定义,分别在“向下”和“向上”操作中进行。在我的例子中是不同的,因为我需要在画线的时候取第一个点 这是我的onTouch()方法。它只是画一条由用户在屏幕上触摸的位置定义的线 public boolean onTouch(View v, MotionEvent event) { if(getEditMode()) {

我需要在一条由许多点定义的直线上画一个箭头,用户将绘制该箭头

我希望我能弄清楚我的问题是什么

谢谢

注意:我在这里看到的所有问题/答案都是为了解决一条线的问题,该线由两个点定义,分别在“向下”和“向上”操作中进行。在我的例子中是不同的,因为我需要在画线的时候取第一个点

这是我的onTouch()方法。它只是画一条由用户在屏幕上触摸的位置定义的线

public boolean onTouch(View v, MotionEvent event) { 
    if(getEditMode()) { 

        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(eventX, eventY); 

                break;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(eventX, eventY); 

                break;
            case MotionEvent.ACTION_UP:
                             //Here i have to draw an arrow.

                drawCanvas.drawPath(path, paint);
                path.reset();

                invalidate();

                break;

        }

        invalidate();
        return true; 

    } else {
        return false; 

    }
}

在绘制箭头之前,我覆盖绘制并旋转画布

//NOTE: 0, 0 is the bottom center point  

vehicle.draw(canvas);

//draw arrow
if (arrow != null && heading != BusLocation.NO_HEADING)
{
    //put the arrow in window
    int arrowLeft = -(arrow.getIntrinsicWidth() / 4);
    int arrowTop = -vehicle.getIntrinsicHeight() + arrowTopDiff;

    //use integer division when possible. This code is frequently executed
    int arrowWidth = (arrow.getIntrinsicWidth() * 6) / 10;  
    int arrowHeight = (arrow.getIntrinsicHeight() * 6) / 10;
    int arrowRight = arrowLeft + arrowWidth;
    int arrowBottom = arrowTop + arrowHeight;

    arrow.setBounds(arrowLeft, arrowTop, arrowRight, arrowBottom);

    canvas.save();
    //set rotation pivot at the center of the arrow image
    canvas.rotate(heading, arrowLeft + arrowWidth/2, arrowTop + arrowHeight / 2);

    Rect rect = arrow.getBounds();
    arrow.draw(canvas);
    arrow.setBounds(rect);

    canvas.restore();

}
public boolean onTouch(View v, MotionEvent event) {
    if(getEditMode()) {
        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                path.moveTo(eventX, eventY);

                pList.clear(); // When I start a line need to clear the previous coorfinates.

                break;

            }

            case MotionEvent.ACTION_MOVE: {
                int hSize = event.getHistorySize();

                path.lineTo(eventX, eventY);

                PointF aux, auxH;

                if(darrow) {
                    if(hSize > 0) { // If movement is too fast.
                        for(int i = 0; i < hSize; i++) {
                            auxH = new PointF(event.getHistoricalX(i), event.getHistoricalY(i));

                            pList.add(auxH);

                        }

                    }

                    aux = new PointF(eventX, eventY);

                    pList.add(aux);

                }

                break;

            }   

            case MotionEvent.ACTION_UP: {
                pend.x = eventX;
                pend.y = eventY;

                if(darrow) { // If need to draw an arrow head to the end of the line;
                    arrowPath = drawArrow(pend); // Store the right arrowhead to a path.

                }

                drawCanvas.drawPath(path, paint);
                drawCanvas.drawPath(arrowPath, paint);

                path.reset();
                arrowPath.reset();

                invalidate();

                break;

            }

        }

        invalidate();

        return true;

    } else {
        return false;

    }

}

}所以,我找到了一个解决办法

我将构成直线的所有点存储在arraylist中

之后,我将0.9*arraylist.size()中的线的一个点作为参考,绘制一个沿着线方向的箭头

这是我的onTouch()方法和用于绘制箭头的函数

//NOTE: 0, 0 is the bottom center point  

vehicle.draw(canvas);

//draw arrow
if (arrow != null && heading != BusLocation.NO_HEADING)
{
    //put the arrow in window
    int arrowLeft = -(arrow.getIntrinsicWidth() / 4);
    int arrowTop = -vehicle.getIntrinsicHeight() + arrowTopDiff;

    //use integer division when possible. This code is frequently executed
    int arrowWidth = (arrow.getIntrinsicWidth() * 6) / 10;  
    int arrowHeight = (arrow.getIntrinsicHeight() * 6) / 10;
    int arrowRight = arrowLeft + arrowWidth;
    int arrowBottom = arrowTop + arrowHeight;

    arrow.setBounds(arrowLeft, arrowTop, arrowRight, arrowBottom);

    canvas.save();
    //set rotation pivot at the center of the arrow image
    canvas.rotate(heading, arrowLeft + arrowWidth/2, arrowTop + arrowHeight / 2);

    Rect rect = arrow.getBounds();
    arrow.draw(canvas);
    arrow.setBounds(rect);

    canvas.restore();

}
public boolean onTouch(View v, MotionEvent event) {
    if(getEditMode()) {
        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                path.moveTo(eventX, eventY);

                pList.clear(); // When I start a line need to clear the previous coorfinates.

                break;

            }

            case MotionEvent.ACTION_MOVE: {
                int hSize = event.getHistorySize();

                path.lineTo(eventX, eventY);

                PointF aux, auxH;

                if(darrow) {
                    if(hSize > 0) { // If movement is too fast.
                        for(int i = 0; i < hSize; i++) {
                            auxH = new PointF(event.getHistoricalX(i), event.getHistoricalY(i));

                            pList.add(auxH);

                        }

                    }

                    aux = new PointF(eventX, eventY);

                    pList.add(aux);

                }

                break;

            }   

            case MotionEvent.ACTION_UP: {
                pend.x = eventX;
                pend.y = eventY;

                if(darrow) { // If need to draw an arrow head to the end of the line;
                    arrowPath = drawArrow(pend); // Store the right arrowhead to a path.

                }

                drawCanvas.drawPath(path, paint);
                drawCanvas.drawPath(arrowPath, paint);

                path.reset();
                arrowPath.reset();

                invalidate();

                break;

            }

        }

        invalidate();

        return true;

    } else {
        return false;

    }

}

好啊那么,你能解释一下你在做什么吗?对不起,我真的不明白你做了什么。