Как добавить наследованный от SurfaceView класс в макет

от
Android   surfaceview

В этой статье я научу вас как добавить в макет обьект класса, наследованного от SurfaceView. Многие не знают как правильно использовать класс, наледованный от абстрактного класса SurfaceView в своих играх и делают это вот так:

  1. public class MainActivity extends Activity {
  2.  
  3.     public void onCreate(Bundle bundle){
  4.         super.onCreate(bundle);
  5.         MySurfaceView msv=new MySurfaceView(this);
  6.         setContentView(msv);
  7.     }
  8. }

С первого взгляда нет ничего страшного в этом способе работы с поверхностью. Но если нам нужно создать макет и описать в нем элемент MySurfaceView, да так чтобы дополнительно вместе с ним в разметку добавить несколько игровых кнопок, то многие начинающие программисты для андроид не находят информации как это сделать. Я тоже не нашел ни в одной книжке и статье про андроид такой информации, поэтому решил написать эту статью, которая будет эксклюзивной в своем роде на просторах российского интернета.
В андроиде есть уникальная возможность использовать классы, которые принадлежат семейству классов View, в xml-файлах с разметкой.
Итак, для того чтобы использовать наследованный от SurfaceView класс в макете, надо в дополнение к конструтору с одним параметром (Context context) добавить дополнительный конструктор с параметрами (Context context, AttributeSet attrs), что позволит работать с классом в макете.
После того как вы обьявили этот конструктор , то можно добавлять элемент нашего класса в разметку таким образом:
  1. <имя_пакета.класс
  2.    layout_width:"match_parent"
  3.    layout_height:"match_parent"
  4. />

Первая строка содержим имя класса с полным указанием пакета, второй и третий параметр-обязательные, они отвечают за ширину и высоту нашей поверхности.
Вот пример добавления поверхности в макет:

**Содержимое класса MySurface**

  1. package com.samodelkin;
  2. import android.content.Context;
  3. import android.view.SurfaceHolder;
  4. import android.view.SurfaceView;
  5.  
  6. public class MySurface extends SurfaceView implements SurfaceHolder.Callback {
  7.  
  8.     public MySurface(Context context) {
  9.         super(context);
  10.     }
  11.  
  12.     public MySurface(Context context, AttributeSet attrs) {
  13.         super(context,attrs);
  14.     }
  15.  
  16.     public void surfaceCreated(SurfaceHolder holder) {
  17.     }
  18.  
  19.     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
  20.     }
  21.  
  22.     public void surfaceDestroyed(SurfaceHolder holder) {
  23.     }
  24. }

**Содержимое макета**

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4.    android:layout_width="match_parent"
  5.    android:layout_height="match_parent"
  6.    android:orientation="horizontal"
  7. >
  8.  
  9.     <com.samodelkin.MySurface
  10.        android:id="@+id/game_surface"    
  11.        android:layout_width="match_parent"
  12.        android:layout_height="match_parent"
  13.     />     
  14.  
  15. </LinearLayout>
0   0   0
1714