I was following the series on canvas drawing ,在 1:27
处,作者引用:“负责管理和绘制布局的类必须扩展 SurfaceView,并且还需要实现线程,因此我们将实现Runnable
接口(interface)”
作者正在实现直接绘制 Canvas ,而不使用 xml 文件,仅使用 java
代码,并使用 java
类而不是 xml
。他在java
中将布局定义为:
public class Activity_Animation002_Layout extends SurfaceView implements Runnable{
Thread thread = null;
public Activity_Animation002_Layout(Context context){
super(context);
}
@Override
public void run(){
while(CanDraw){
//TODO- carry out drawing....
}
}
//some more code to follow
}
关联的 Activity 文件具有如下代码:
public class AnimationActivity002 extends Activity{
Activity_Animation002_Layout animation002_LayoutView;
@Override
protected void onCreate(Bundle savedInstance){
super.onCreate(savedInstanceState);
animation002_LayoutView = new Activity_Animation002_Layout(this);
setContentView(animation002_LayoutView);
}
}
这种绘画技术已经过时了吗?我的意思是我进行了高低搜索,并尝试用谷歌搜索,检查了如下页面:Custom Drawing , Canvas Drawing , Layouts , Layout Resource , SurfaceView但它们甚至都没有扩展 SurfaceView。 我在文档中哪里可以找到这个? 但是如果这是一种过时的技术或其他东西,那么做同样事情的新方法是什么?
最佳答案
- 您可以更轻松地做到这一点,但问题在于您真正想在这里实现什么。您几乎可以简单地在其
onDraw(Canvas)
中的View
类中进行绘图。 SurfaceView
是一种特殊的 View 。使用 SurfaceView,您可以在另一个线程(而不是 UI 线程)上绘图。这就是为什么你的类必须实现 Runnable - 你必须将它传递给线程。一个例子:View
在 UI 线程上绘制,因此如果您尝试在该 View 中为某些内容设置动画并在 UI 线程上执行一些操作(例如滚动布局),则会出现延迟SurfaceView
利用另一个线程,因此您可以自由地为某些内容设置动画,也可以滚动、单击内容等,而不会出现任何延迟。
SurfaceView
也可能用于游戏(屏幕上发生很多事情),但我不会说它现在被大量用于游戏。但事实是,可以基于SurfaceView
制作一些狡猾的游戏,或者像 flappy Bird
总结:
- 我不认为这是一种过时的技术,更像是不常用的技术,因为您会在特定情况下使用它,您需要在不卡住 UI 线程的情况下绘制某些内容(例如简单的动画)
- 您还可以在简单的
View
类中进行绘制,但仅当您不打算使用 UI 执行其他操作时才可以。 (或者如果绘图不长)。 您提到的视频中的事情可以在一个简单的View
中完成,因为那里没有发生太多事情 - 您只需绘制一次图像即可。我什至记得我完全使用View
类完成了一个纸牌游戏,您可以将纸牌拖到中间来玩。
关于java - 直接绘制到 Canvas 并使用 java 代码创建布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59991007/