Android: Cómo agregar un botón en vista de superficie

Estoy dibujando algunos gráficos y me gustaría añadir un par de botones a la misma. Pero con la vista de la superficie ¿cómo podemos agregar estos botones mediante programación?

Encierra tu superficieVer con un FrameLayout en tu xml Layout. A continuación, agregue los botones al mismo FrameLayout. Asegúrese de que se colocan debajo de la vista de la superficie para que se dibuja en la parte superior de la misma. (Podría ser una buena idea agruparlos en otro Layout y añadirlo al FrameLayout.)

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surfaceView1" android:layout_width="wrap_content" android:layout_height="wrap_content"></SurfaceView> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:text="Button" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> <Button android:text="Button" android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> </FrameLayout> 

Muchas gracias Androidica ..

Su xml me ha ayudado a averiguar la siguiente solución mediante programación sin utilizar ningún xml ..

 public class LudoActivity extends Activity implements OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); FrameLayout game = new FrameLayout(this); GameView gameView = new GameView (this); LinearLayout gameWidgets = new LinearLayout (this); Button endGameButton = new Button(this); TextView myText = new TextView(this); endGameButton.setWidth(300); endGameButton.setText("Start Game"); myText.setText("rIZ..i"); gameWidgets.addView(myText); gameWidgets.addView(endGameButton); game.addView(gameView); game.addView(gameWidgets); setContentView(game); endGameButton.setOnClickListener(this); } public void onClick(View v) { Intent intent = new Intent(this, LudoActivity.class); startActivity(intent); // re-starts this activity from game-view. add this.finish(); to remove from stack } } 

Mientras que GameView es;

 public class GameView extends SurfaceView { public GameView(Context context) { super(context); /* * your code */ } } 

Haga su propio botón:

 import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.RectF; public class GButton { public Matrix btn_matrix = new Matrix(); public RectF btn_rect; float width; float height; Bitmap bg; public GButton(float width, float height, Bitmap bg) { this.width = width; this.height = height; this.bg = bg; btn_rect = new RectF(0, 0, width, height); } public void setPosition(float x, float y) { btn_matrix.setTranslate(x, y); btn_matrix.mapRect(btn_rect); } public void draw(Canvas canvas) { canvas.drawBitmap(bg, btn_matrix, null); } } 

En evento de toque:

 float x = ev.getX(); float y = ev.getY(); if (my_button.btn_rect.contains(x, y)) { // handle on touch here } 

Alternativamente, incluso mejor, si desea también girar el botón que no será eje alineado, a continuación, utilice la matriz invertida, en lugar de mapRect mapa de los puntos de contacto x, y:

 float pts[] = {x, y}; my_button.invert_matrix.mapPoints(pts); if (my_button.btn_rect.contains(pts[0], pts[1]) { // handle on touch here } 

Podemos utilizar la disposición del marco para el dibujo superficial dibujar muy fácilmente. Me gusta esto

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <FrameLayout android:id="@+id/frameLayout" android:layout_width="fill_parent" android:layout_height="430dp"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="50dp" android:gravity="center_horizontal" android:layout_gravity="bottom" android:background="#c2300f"> <Button android:id="@+id/buttonColor" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Color" /> </LinearLayout> </LinearLayout> 

Y la actividad principal es

 package com.example.surfacetuto; import android.app.Activity; import android.graphics.Paint; import android.graphics.Point; import android.os.Bundle; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener{ DrawingSurface ds; FrameLayout frm; Button btnC; int color=0xfff00000; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ds=new DrawingSurface(this); setContentView(R.layout.activity_main); frm=(FrameLayout)findViewById(R.id.frameLayout); frm.addView(ds); btnC=(Button)findViewById(R.id.buttonColor); btnC.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.buttonColor: Toast.makeText(getApplicationContext(), "Color", 2).show(); ds.colorNew(); break; default: break; } } } 

Y la clase Surface de dibujo es

 package com.example.surfacetuto; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Paint.Cap; import android.graphics.Rect; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.widget.Toast; public class DrawingSurface extends SurfaceView implements SurfaceHolder.Callback { Canvas cacheCanvas; Bitmap backBuffer; int width, height, clientHeight; Paint paint; Context context; SurfaceHolder mHolder; public DrawingSurface(Context context) { super(context); this.context = context; init(); } public DrawingSurface(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; init(); } private void init() { mHolder = getHolder(); mHolder.addCallback(this); } int lastX, lastY, currX, currY; boolean isDeleting; @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); int action = event.getAction(); switch(action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getX(); lastY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: if(isDeleting) break; currX = (int) event.getX(); currY = (int) event.getY(); cacheCanvas.drawLine(lastX, lastY, currX, currY, paint); lastX = currX; lastY = currY; break; case MotionEvent.ACTION_UP: if(isDeleting) isDeleting = false; break; case MotionEvent.ACTION_POINTER_DOWN: cacheCanvas.drawColor(Color.WHITE); isDeleting = true; break; case MotionEvent.ACTION_POINTER_UP: break; } draw(); return true; } protected void draw() { if(clientHeight==0) { clientHeight = getClientHeight(); height = clientHeight; backBuffer = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888); cacheCanvas.setBitmap(backBuffer); cacheCanvas.drawColor(Color.WHITE); } Canvas canvas = null; try{ canvas = mHolder.lockCanvas(null); canvas.drawBitmap(backBuffer, 0,0, paint); }catch(Exception ex){ ex.printStackTrace(); }finally{ if(mHolder!=null) mHolder.unlockCanvasAndPost(canvas); } } private int getClientHeight() { Rect rect= new Rect(); Window window = ((Activity)context).getWindow(); window.getDecorView().getWindowVisibleDisplayFrame(rect); int statusBarHeight= rect.top; int contentViewTop= window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); int titleBarHeight= contentViewTop - statusBarHeight; return ((Activity)context).getWindowManager().getDefaultDisplay(). getHeight() - statusBarHeight - titleBarHeight; } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceCreated(SurfaceHolder holder) { width = getWidth(); height = getHeight(); cacheCanvas = new Canvas(); backBuffer = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888); cacheCanvas.setBitmap(backBuffer); cacheCanvas.drawColor(Color.WHITE); paint = new Paint(); paint.setColor(Color.BLUE); paint.setStrokeWidth(10); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeJoin(Paint.Join.ROUND); draw(); } public void surfaceDestroyed(SurfaceHolder holder) { boolean retry = true; thread.setRunning(false); while (retry) { try { thread.join(); retry = false; } catch (InterruptedException e) { // we will try it again and again... } } } public void colorNew() { // TODO Auto-generated method stub paint.setColor(Color.GRAY); } } 
  • La superficie de Android se bloquea cuando se va al fondo
  • Tutorial de cámara para Android (con vista de superficie)
  • Get " conectar: ​​ya conectado" error si dibujo un mapa de bits como el fondo de SurfaceView y luego reproducir vídeo
  • Android: Recuperando el enfoque con SurfaceView
  • Cómo dibujar una superposición en un SurfaceView utilizado por la cámara en Android?
  • Escala de un SurfaceView fijo para rellenar verticalmente y mantener la relación de aspecto
  • ¿Cómo lograr 30 fotogramas por segundo utilizando Android SurfaceView?
  • Antialiasing en TextureView
  • Android: ¿Cómo puedo configurar mi superficie personalizada con una relación de tamaño fijo en xml?
  • ¿Es posible destruir SurfaceView manualmente?
  • Cómo conciliar la diferencia en la relación de aspecto entre el tamaño de vista previa de la cámara y el tamaño de la imagen
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.