如何在SurfaceView的画布上绘制可绘制的矢量?

问题描述

我的活动具有带有SurfaceView类的setContentView。 现在,我试图在此SurfaceView画布上绘制VectorDrawable失败,我只能看到黑屏。

所以我在XML文件-R.drawable.battery中有一些矢量图形。它可以在Android Studio预览窗口中正确显示。

public class BoardActivity extends Activity {
MySurfaceView mySurface; // My surfaceview class
Drawable vd;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mySurface = new MySurfaceView(this);
       vd = ContextCompat.getDrawable(getApplicationContext(),R.drawable.battery);
        setContentView(mySurface);

public class MySurfaceView extends SurfaceView implements Runnable{
 Thread t;
 SurfaceHolder holder;
 boolean isItOK = false;

public MySurfaceView(Context context) {
  super(context);
  holder = getHolder(); 
  resume();
}

@Override
public void run() {
  while(isItOK==true) {
   if(!holder.getSurface().isValid()) {
       continue;
   }
  Canvas canvas = holder.lockCanvas();
  canvas .drawARGB(80,188,230,227 ); 
  vd.draw(canvas); // draw nothing! 

  // canvas.drawRect(...   works perfect! The issue is only with vd.draw(canvas); 
  holder.unlockCanvasAndPost(c);
}

  public void pause() {
        isItOK = false;
        while(true) {
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            break;
        }
        t = null;
    }


    public void resume(){
        isItOK = true; //Starting drawing 
        t = new Thread(this);
        t.start();
    }    
}

解决方法

我是Android的新手,所以我真的不知道我要向您展示的内容是否是一种好习惯,但这是:

import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.SurfaceView;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Drawable d = getResources().getDrawable(R.drawable.battery,null);
        final SurfaceView view = new SurfaceView(this) {
            @Override
            protected void onDraw(Canvas canvas) {
                super.onDraw(canvas);
                d.setBounds(0,canvas.getWidth(),canvas.getHeight());
                d.draw(canvas);
            }
        };
        view.setBackgroundColor(Color.WHITE);
        setContentView(view);
    }
}

此代码对我有用。

重要:您是否将背景色设置为白色?如果没有,我认为您应该这样做,并且如果可绘制对象正确显示在Android Studio的 Design 标签中,那么我认为它也应在您的应用程序中正常工作。

或者(可能更好),您可以考虑使用ImageView并将其添加到布局资源文件中。例如,主要活动代码可以变为:

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

,然后放在res/layout/activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/battery"
        android:contentDescription="@string/batteryDesc" />
</androidx.constraintlayout.widget.ConstraintLayout>

不要忘记在batteryDesc中添加一个名为常量的res/values/strings.xml

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...