рисование непосредственно на холст и создание макета с использованием кода java - PullRequest
2 голосов
/ 30 января 2020

Я следил за серией рисунков на холсте , а на 1:27 автор цитирует: " Класс, отвечающий за управление и рисование макета, должен расширять SurfaceView, а также должен реализовать поток, поэтому мы собираемся реализовать интерфейс Runnable"

Автор реализует прямое рисование на холст без использования файлов 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
}  

В связанном файле действий есть код, подобный следующему:

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);
    }
}  

Является ли эта техника рисования устаревшей? Я имею в виду, что поиск по максимуму и минимуму, и попытался Google, проверил страницы, как: Пользовательский рисунок , Рисунок на холсте , Макеты , Ресурс макета , SurfaceView , но ни один из них так сильно не расширяет surfaceView. Где я могу найти это в документации? Но если это устаревшая техника или что-то вроде , то каков новый способ сделать то же самое?

1 Ответ

2 голосов
/ 30 января 2020
  1. Вы можете сделать это проще, но дело в том, чего вы действительно хотите достичь здесь . Вы можете сделать рисование просто в классе View, поскольку onDraw(Canvas).
  2. SurfaceView - это особый вид View. С SurfaceView вы можете рисовать в другом потоке (не в потоке пользовательского интерфейса). Вот почему ваш класс должен реализовать Runnable - вы должны передать его в поток. Пример:

    • View dr aws в потоке пользовательского интерфейса, поэтому, если вы попытаетесь что-то анимировать в этом представлении и сделать что-то в потоке пользовательского интерфейса (например, прокрутить макет), это будет laggy
    • SurfaceView dr aws в другой ветке, так что вы можете свободно анимировать что-то, а также прокручивать, нажимать вещи и т.д. c без лагов.
  3. SurfaceView может также использоваться для игр (где на экране много чего происходит), но я бы не сказал, что в настоящее время он широко используется для этого. Но факт в том, что можно сделать несколько хитрых игр на основе SurfaceView или что-то вроде flappy bird

Подводя итог:

  • Я не думаю, что это устаревшая техника, больше похожая на то, что она обычно не используется, потому что вы использовали бы ее в конкретной c ситуации, когда вам нужно рисовать что-то (например, простую анимацию) без зависания интерфейса Тема
  • Вы также можете нарисовать простой класс View, но это нормально, только если вы не планируете выполнять другие действия с пользовательским интерфейсом. (или если рисунок не длинный). Вещи из упомянутого вами видео можно было бы сделать простым View, потому что там не так много всего происходит - вы просто рисуете изображения один раз, и вот оно. Я даже помню, что я сделал карточную игру полностью с классом View, где вы перетаскивали карты в центр, чтобы играть.
...