1

カメラ プレビューの上に描画を重ねようとしています。SurfaceView から拡張された 2 つのカスタム クラスを作成しました。1 つはオーバーレイ用、もう 1 つはカム用です。これが私のlogcatです(「Caused by」ステートメントのみ):

04-11 19:58:06.549: W/dalvikvm(867): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
04-11 19:58:06.609: E/AndroidRuntime(867): Caused by: android.view.InflateException: Binary XML file line #5: Error inflating class com.example.gui_v9.Activity1.CamView
04-11 19:58:06.609: E/AndroidRuntime(867): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.gui_v9.Activity1.CamView" on path: /data/app/com.example.gui_v9-2.apk

クラスが見つからない 2 番目のエラーは、膨張しなかったためです。

Eclipse Graphical Layout は xml コードを正常にコンパイルし、適切なプレビューを提供します。ここに私のXMLコードがあります:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">

    <com.example.gui_v9.Activity1.CamView 
        android:id="@+id/camview"
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"/>

    <com.example.gui_v9.Activity1.OverlayView
        android:id="@+id/overlay"
        android:layout_width="200dp"
        android:layout_height="200dp"/>

</FrameLayout>

からフラグを変更しようとしました

<com.example.gui_v9.Activity1.OverlayView .../> 

<com.example.gui_v9.Activity1.OverlayView ...></com.example.gui_v9.Activity1.OverlayView> 

または

<SurfaceView class="com.example.gui_v9.Activity1$OverlayView" ... /> 

あるいは

<SurfaceView class="com.example.gui_v9.Activity1$OverlayView" ... ></SurfaceView> 

運がなければ。後者の場合、キャストの問題があり (CamView は SurfaceView でキャストできません)、Eclipse の XML グラフィカル レイアウトはレンダリングに失敗するため、最初の例ではコンパイル プロセスがさらに進んでいると推測しています。

私の主な活動もご覧ください。

package com.example.gui_v9;
import java.io.IOException;

import android.os.Bundle;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.hardware.Camera;


public class Activity1 extends Activity {
    CamView         camview         = null;
    OverlayView     overlay         = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity1);

        camview     = (CamView) findViewById(R.id.camview);
        overlay     = (OverlayView) findViewById(R.id.overlay);
        overlay.getHolder().setFormat(PixelFormat.TRANSLUCENT);
    }

    public static class CamView extends SurfaceView implements SurfaceHolder.Callback {
        Camera          cam             = null;
        SurfaceHolder   camviewholder   = null;

        public CamView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }

        public CamView(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
        }

        public CamView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
            if (cam!=null) {
                try {
                    cam.setPreviewDisplay(camviewholder);
                } 
                catch (IOException e) {
                }
              cam.startPreview();
            }
        }

        @Override
        public void surfaceCreated(SurfaceHolder arg0) {
            cam             = Camera.open();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder arg0) {
            cam.stopPreview();
            cam.release();
        }
    }

    public static class OverlayView extends SurfaceView implements SurfaceHolder.Callback {
        private Paint paint = new Paint();
        OverlayThread   overlaythread   = null;

        public OverlayView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }

        public OverlayView(Context context, AttributeSet attrs) {
            super(context, attrs);
            // TODO Auto-generated constructor stub
        }

        public OverlayView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
        }

        @Override 
        public void onDraw(Canvas canvas) { 
            paint.setColor(Color.BLUE);
            canvas.drawCircle(100, 100, 100, paint);
        } 

        @Override
        public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {  
        }

        @Override
        public void surfaceCreated(SurfaceHolder arg0) {
            setWillNotDraw(false); //Allows us to use invalidate() to call onDraw()
            overlaythread = new OverlayThread(getHolder(), this); 
            overlaythread.setRunning(true);                 
            overlaythread.start();                          
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder arg0) {
            try {
                overlaythread.setRunning(false); 
                overlaythread.join(); 
            } 
            catch (InterruptedException e) {
            }
        }
    }

    public static class OverlayThread extends Thread {
        private OverlayView     overlay;
        private SurfaceHolder   overlayholder;
        private boolean _run = false;

        public OverlayThread(SurfaceHolder _overlayholder, OverlayView _overlay) {
            overlayholder   = _overlayholder;
            overlay         = _overlay;
        }

        public void setRunning(boolean run) { 
            _run = run;
        }

        @Override
        public void run() {
            Canvas c;
            while (_run) {   
                c = null;      
                try {
                    c = overlayholder.lockCanvas(null);
                    synchronized (overlayholder) {

                     overlay.invalidate();
                    }
                } 
                finally {
                    if (c != null) {
                        overlayholder.unlockCanvasAndPost(c);
                    }
                }
            }
        }
    }  
}

ご覧のとおり、クラスごとに 3 つのコンストラクター (引数が 1、2、および 3 つ) があります。これは、クラスの失敗を膨らませる際の一般的なエラーです。

CamView と OverlayView を 2 つの別個のクラス (CamView.java と OverlayView.java) にそれぞれ実装したときに、これが機能するようになりました。したがって、クラスをインポートすると機能する理由がわかりません。多分静的ワークスペースで何か?

助けてくれてありがとう!

4

0 に答える 0