首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在自定义视图中画一条线

在自定义视图中画一条线
EN

Stack Overflow用户
提问于 2014-03-13 08:36:52
回答 2查看 1.2K关注 0票数 1

INTRODUCTION

我正在练习定制视图,我需要做一个应用程序:这个应用程序显示一个小圆圈(就像一个小球),这个球移动尊重手机的方向(使用加速度计)。我已经处理好了。

问题

现在,我需要获得一个额外的功能:

  • 这个球现在出现在屏幕的左上角,我需要它出现在中间。
  • 我需要画出球的轨迹,也就是画一条代表球轨迹的黑线。

这是我的自定义视图的代码:

代码语言:javascript
复制
public class MyView extends View {

    private Path drawPath;
    private Paint drawPaint;
    private Bitmap canvasBitmap;
    float speedX;
    float speedY;
    float radius = 10;
    float posX = radius;
    float posY = radius;
    long lastUpdateTime = 0;
    final float METER_TO_PIXEL = 50.0f;


    /**
     * Constructor
     */
    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setupDraw();
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(drawPath, drawPaint);
        canvas.drawCircle(posX, posY, radius, drawPaint);
    }


    private void setupDraw() {

        drawPaint = new Paint();
        drawPaint.setColor(Color.BLACK);
        canvasBitmap = Bitmap.createBitmap(640, 1200, Bitmap.Config.ARGB_8888);
        posX = getWidth() /2;
        posY = getHeight() /2;
    }

    public void update (float gravityX, float gravityY) {

        if(lastUpdateTime == 0) {
            lastUpdateTime = System.currentTimeMillis();
            return;
        }
        long now = System.currentTimeMillis();
        long ellapse = now - lastUpdateTime;
        lastUpdateTime = now;

        speedX -=((gravityX * ellapse)/1000.0f) * METER_TO_PIXEL;
        speedY +=((gravityY * ellapse)/1000.0f) * METER_TO_PIXEL;

        posX += ((speedX * ellapse) / 1000.0f);
        posY += ((speedY * ellapse) / 1000.0f);

        /*Checks screen limits*/
        if (posX < radius) {
            posX = radius;
            speedX = 0;
        }
        else if (posX > (getWidth() - radius)) {
            posX = getWidth() - radius;
            speedX = 0;
        }
        if (posY < radius) {
            posY = radius;
            speedY = 0;
        }
        else if (posY > (getHeight() - radius)) {
            posY = getHeight() - radius;
            speedY = 0;
        }
        this.invalidate();
    }


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        /*HERE IS WHERE I TRY TO SET THE BALL ON THE MIDDLE OF THE SCREEN*/
        drawPath = new Path();
        drawPath.moveTo(w / 2, h / 2);
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-13 14:39:28

我做到了把球放在中间:

代码语言:javascript
复制
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);

    if (isFirstTime) {
        drawPath = new Path();
        drawPath.moveTo(w / 2, h / 2);
        isFirstTime = false;
    }
    //...
}

我从中间开始画路线:

代码语言:javascript
复制
public void update (float gravityX, float gravityY) {

    if(lastUpdateTime == 0) {
        posX = getWidth() /2;
        posY = getHeight() /2;
        lastUpdateTime = System.currentTimeMillis();
        this.invalidate();
    }
    //...
}

但要走这条路我还是有些麻烦。我画了一些东西,但它画了两条线:第一条是球道,第二条是从中间到球的直线。最后一条线使两条线之间的表面画得很好,所以我仍然要看如何解决这个问题。

为此,我在update()方法的末尾包含了以下内容:

代码语言:javascript
复制
drawPath.lineTo(posX, posY);
drawCanvas.drawPath(drawPath, drawPaint);
this.invalidate();

我的onDraw()方法如下所示:

代码语言:javascript
复制
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    canvas.drawPath(drawPath, drawPaint);
    canvas.drawCircle(posX, posY, radius, drawPaint);
}
票数 1
EN

Stack Overflow用户

发布于 2014-03-13 09:32:56

那麽:

代码语言:javascript
复制
// here you put your values
canvas.drawLine(0, 0, 20, 20, drawPaint);

将这一行放在您的onDraw函数上

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22373095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档