Wbaig 2022-03-19 19:17 采纳率: 60%
浏览 28
已结题

为什么使用surfaceview画图时线条显示不出来?

想做出心电图类似的效果,看了好多代码整合了一下,写好之后发现画不出来,检查也检查不出来问题。

package com.example.wivedraw;



import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
    private SurfaceHolder mSurfaceHolder;
    //绘图的Canvas
    private Canvas mCanvas;
    //子线程标志位
    private boolean mIsDrawing;
    private int[] x = new int[1440];
    private int[] y = new int[1440];
    public int i=0;
    private Paint mPaint;
    private Path mPath;
    public MySurfaceView(Context context) {
        this(context, null);
    }

    public MySurfaceView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mIsDrawing = true;
        x[0]=999;
        y[0]=getHeight()/2;
        new Thread(this).start();
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mIsDrawing = false;
    }

    @Override
    public void run() {

        while (mIsDrawing){
            drawWive();
            try {
                Thread.sleep(1);
            }catch (Exception e){
                e.printStackTrace();
            }
        }

    }

    private void drawWive() {
        //获得canvas对象
        mCanvas = mSurfaceHolder.lockCanvas();
        //绘制背景
        mCanvas.drawColor(Color.WHITE);

        int width =getWidth() ;
        int height=getHeight();
        mPaint = new Paint();
        mPaint.setColor(Color.RED);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setAntiAlias(true);//抗锯齿
        mPaint.setStrokeWidth(5);
        mPath = new Path();
        //路径起始点(0, 100)
        mPath.moveTo(x[0],y[0]);

        for (int j = 0; j < i; j++) {
            x[j] -= 1;
        }

        x[i] = 1440;
        y[i] = (int) (100 * Math.sin(2 * i * Math.PI / 180) + height / 2);

        for (int j = 0; j <= i; j++) {
            mPath.lineTo(x[j], y[j]);
        }

        i+=1;

        if (mCanvas != null){
           //释放canvas对象并提交画布
                mSurfaceHolder.unlockCanvasAndPost(mCanvas);
            }
    }

    /**
     * 初始化View
     */
    private void initView(){
        mSurfaceHolder = getHolder();
        mSurfaceHolder.addCallback(this);
        setFocusable(true);
        setKeepScreenOn(true);
        setFocusableInTouchMode(true);
    }
}

显示运行成功,但是一片空白

希望能解决问题,有余力的话麻烦帮我把代码美化一下,第一次写,所以有些地方放的不合适请谅解

  • 写回答

1条回答 默认 最新

  • 小张同志正在划水 2022-03-21 13:44
    关注

    你用canvas.drawPath()的方法了吗?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 创建了问题 3月19日

悬赏问题

  • ¥15 在rhel8中安装qemu-kvm时遇到“cannot initialize crypto:unable to initialize gcrypt“报错”
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 paddle库安装时报错提示需要安装common、dual等库,安装了上面的库以后还是显示报错未安装,要怎么办呀?
  • ¥20 找能定制Python脚本的
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据
  • ¥15 用C语言怎么判断字符串的输入是否符合设定?
  • ¥15 通信专业本科生论文选这两个哪个方向好研究呀
  • ¥50 我在一个购物网站的排队系统排队,这个排队到号后重新定向到目标网站进行购物,但是有技术牛通过技术方法直接跳过排队系统进入目标网址购物,有没有什么软件或者脚本可以用
  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?
  • ¥300 寻抓云闪付tn组成网页付款链接