java - 直接绘制到 Canvas 并使用 java 代码创建布局

标签 java android canvas surfaceview

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。 我在文档中哪里可以找到这个? 但是如果这是一种过时的技术或其他东西,那么做同样事情的新方法是什么?

最佳答案

  1. 您可以更轻松地做到这一点,但问题在于您真正想在这里实现什么。您几乎可以简单地在其 onDraw(Canvas) 中的 View 类中进行绘图。
  2. SurfaceView 是一种特殊的 View 。使用 SurfaceView,您可以在另一个线程(而不是 UI 线程)上绘图。这就是为什么你的类必须实现 Runnable - 你必须将它传递给线程。一个例子:

    • View 在 UI 线程上绘制,因此如果您尝试在该 View 中为某些内容设置动画并在 UI 线程上执行一些操作(例如滚动布局),则会出现延迟
    • SurfaceView 利用另一个线程,因此您可以自由地为某些内容设置动画,也可以滚动、单击内容等,而不会出现任何延迟。
  3. SurfaceView 也可能用于游戏(屏幕上发生很多事情),但我不会说它现在被大量用于游戏。但事实是,可以基于 SurfaceView 制作一些狡猾的游戏,或者像 flappy Bird

总结:

  • 我不认为这是一种过时的技术,更像是不常用的技术,因为您会在特定情况下使用它,您需要在不卡住 UI 线程的情况下绘制某些内容(例如简单的动画)
  • 您还可以在简单的 View 类中进行绘制,但仅当您不打算使用 UI 执行其他操作时才可以。 (或者如果绘图不长)。 您提到的视频中的事情可以在一个简单的 View 中完成,因为那里没有发生太多事情 - 您只需绘制一次图像即可。我什至记得我完全使用 View 类完成了一个纸牌游戏,您可以将纸牌拖到中间来玩。

关于java - 直接绘制到 Canvas 并使用 java 代码创建布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59991007/

相关文章:

java - 如何从 Spring Boot 中的实体访问存储库?

javascript - 从 Firebase 读取数据并放入数组中

android - 无法解决**无法合并dex错误**

javascript - CSS 着色器适用于 2d Canvas 吗?

java - Tomcat 将 JAVA_HOME 设置为指向 JRE 而不是 JDK

java - 提交表单而不进行 bean 验证

java - 定位 path.lineTo()

javascript - 如何裁剪 Canvas 边?

javascript - 在 Canvas 中同时移动一组对象

java - 构造函数 ClassRoll(String f) 赋值帮助,我需要确定为什么无法显示滚动