Уважаемые форумчане, подскажите пожалуйста, что не так, почему один вид перекрывает другой, а не рисует поверх камеры? у меня показывает либо камера, либо черный прямоугольник, но никак не получается рисовать поверх камеры, т.е. прямоугольник получается непрозрачный, не пойму почему. У меня разметка имеет следующий вид: Код | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_preview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:contentDescription="@string/contentdescr" >
<FrameLayout android:id="@+id/camera_preview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:contentDescription="@string/contentdescr" android:measureAllChildren="false" > </FrameLayout> </RelativeLayout>
|
Далее имеется два класса, один для превью камеры, другой для рисования над ней кнопок и тп. 1 класс - превью камеры: Код | public class CameraClPrewiew extends SurfaceView implements SurfaceHolder.Callback {
public SurfaceHolder mHolder; public Camera mCamera;
public CameraClPrewiew (Context context, Camera camera) { super(context); mCamera=camera; mHolder=getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); }
public void surfaceCreated(SurfaceHolder holder) { mCamera=Camera.open(); try { if (holder!=null) mCamera.setPreviewDisplay(holder); } catch (IOException e) { mCamera.stopPreview(); mCamera.release(); } mCamera.startPreview(); }
public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); }
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { mCamera.startPreview(); } }
|
2 класс для рисования: Код | public class CameraClDraw extends SurfaceView implements Runnable {
private AssetManager asset; Bitmap framebuffer; Thread renderThread = null; SurfaceHolder mholder; volatile boolean running = false; Canvas canvas; Rect dstRect;
public CameraClDraw (Context context, Bitmap framebuffer) { super(context); this.framebuffer=framebuffer; mholder = this.getHolder(); }
public void resume() { running = true; renderThread = new Thread(this); renderThread.start(); }
@Override public void run() { dstRect = new Rect(); while(running) { if(!mholder.getSurface().isValid()) continue; canvas = mholder.lockCanvas(); canvas.getClipBounds(dstRect); canvas.drawBitmap(framebuffer, null, dstRect, null); mholder.unlockCanvasAndPost(canvas); }
} public void pause() { running = false; while(true) { try { renderThread.join(); break; } catch (InterruptedException e) { } } } }
|
и основная активность: Код | public class CameraCl extends Activity {
public int windowh,windoww; private CameraClPrewiew cam; private CameraClDraw camDraw; public Camera camera;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); boolean isLandscape = getResources().getConfiguration().orientation== Configuration.ORIENTATION_LANDSCAPE; windowh = getWindow().getWindowManager().getDefaultDisplay().getHeight(); windoww = getWindow().getWindowManager().getDefaultDisplay().getWidth(); int frameBufferWidth = isLandscape ? windoww : windowh; int frameBufferHeight = isLandscape ? windowh : windoww; Bitmap framebuffer = Bitmap.createBitmap(frameBufferWidth,frameBufferHeight, Config.RGB_565); setContentView(R.layout.activity_class_camera); cam=new CameraClPrewiew (this, camera); camDraw = new CameraClDraw(this, framebuffer); FrameLayout camlayout=(FrameLayout)findViewById(R.id.camera_preview); [color=red]camlayout.addView(cam); camlayout.addView(camDraw);[/color] } @Override public void onResume() { super.onResume(); camDraw.resume(); }
@Override public void onPause() { super.onPause(); camDraw.pause(); } }
|
|