如何解决如何在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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。