月月月熊~ 2021-09-15 21:42 采纳率: 75%
浏览 53
已结题

Android canvas 想做出一个起点变化 终点不变的线的效果 代码可以运行 模拟器没显示

这是activity—main.xml里的

<LinearLayout
        android:id="@+id/wang"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></LinearLayout>

这是MainActivity.java里的

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }
    private void init() {
        LinearLayout layout = (LinearLayout)findViewById(R.id.wang);
        final CustomView view=new CustomView(this);
        layout.addView(view);

    }
}

这是CustomView.java里的

public class CustomView extends View {
    private int x,y,nextX,nextY;
    public CustomView(Context context) {
        super(context);
    }
    public CustomView(Context context,int x,int y,int nextX,int nextY){
      super(context);
        this.x=x;
        this.y=y;
        this.nextX=nextX;
        this.nextY=nextY;
        init();
    }
    private void init(){
        Paint paint = new Paint(); //设置一个笔刷大小是3的黄色的画笔
        paint.setColor(Color.RED);
        paint.setStrokeJoin(Paint.Join.ROUND);//设置线段连接处样式
        paint.setStrokeCap(Paint.Cap.ROUND);//设置线冒样式,取值有Cap.ROUND(圆形线冒)、Cap.SQUARE(方形线冒)、Paint.Cap.BUTT(无线冒)
        paint.setStrokeWidth(10f);
        paint.setAntiAlias(true);

        ValueAnimator valueAnimatorX =ValueAnimator.ofInt(x,nextX);
        valueAnimatorX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
              public void onAnimationUpdate(ValueAnimator animation){
                nextX=x;
                invalidate();
            }
        });
        ValueAnimator valueAnimatorY=ValueAnimator.ofInt(y,nextY);
        valueAnimatorY.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
               public void onAnimationUpdate (ValueAnimator animation){
                 nextY = y + 10;
                 invalidate();
    }
    });

        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(2000);
        animatorSet.start();
    }
    Paint paint;
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    //canvas.drawColor(Color.WHITE);
       // canvas.drawLine(500 , 70, 200, 500, paint);//from x,y to x,y
        canvas.drawLine(nextX,nextY,200,500,paint);
    }
}

不知道为什么不对 感谢大家看一下

img

  • 写回答

2条回答 默认 最新

  • 楚江临 2021-09-16 09:54
    关注

    这个地方不对 final CustomView view=new CustomView(this);
    layout.addView(view);
    这里你调用的构造方法不对,直接走到了 public CustomView(Context context) {
    super(context);
    }
    这样你的 Paint paint; 没有进行初始化,空指针报错, 如果用另外一个构造方法也会报空指针异常。Paint paint = new Paint() 这个初始化的是局部变量,你在onDra调用的是全局的paint, 但是全局paint没有初始化。将Paint paint = new Paint();改为 paint = new Paint(); 使用第二个构造方法进行初始化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月26日
  • 已采纳回答 9月18日
  • 创建了问题 9月15日

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?