0

ペイントアプリを作成していますが、画像の上に何も描画/ペイントできません。助けてください:

public class DrawingSurface extends SurfaceView implements SurfaceHolder.Callback {
    private Boolean _run;
    protected DrawThread thread;
    private Bitmap mBitmap;
    public boolean isDrawing = true;
    public DrawingPath previewPath;

    private CommandManager commandManager;

    public DrawingSurface(Context context, AttributeSet attrs) {
        super(context, attrs);

        getHolder().addCallback(this);


        commandManager = new CommandManager();
        thread = new DrawThread(getHolder());
    }

    private Handler previewDoneHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            isDrawing = false;
        }
    };

    class DrawThread extends  Thread{
        private SurfaceHolder mSurfaceHolder;


        public DrawThread(SurfaceHolder surfaceHolder){
            mSurfaceHolder = surfaceHolder;

        }

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


        @Override
        public void run() {
            Canvas canvas = null;
            while (_run){
                if(isDrawing == true){
                    try{
                        canvas = mSurfaceHolder.lockCanvas(null);
                        if(mBitmap == null){
                          //  mBitmap =  Bitmap.createBitmap (1, 1, Bitmap.Config.ARGB_8888);
                             mBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.splashscreen);

                        }
                //       final Canvas c = new Canvas (mBitmap);
                        mBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.splashscreen);

                   //     c.drawColor(0, PorterDuff.Mode.CLEAR);
                       canvas.drawColor(0, PorterDuff.Mode.CLEAR);


                     //   commandManager.executeAll(c,previewDoneHandler);
                     //   previewPath.draw(c);

                        canvas.drawBitmap (mBitmap, 0,  0,null);
                    } finally {
                        mSurfaceHolder.unlockCanvasAndPost(canvas);
                    }


                }

            }

        }
    }


    public void addDrawingPath (DrawingPath drawingPath){
        commandManager.addCommand(drawingPath);
    }
   // Bitmap mBitmap = Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter);




    public boolean hasMoreRedo(){
        return commandManager.hasMoreRedo();
    }

    public void redo(){
        isDrawing = true;
        commandManager.redo();


    }

    public void undo(){
        isDrawing = true;
        commandManager.undo();
    }

    public boolean hasMoreUndo(){
        return commandManager.hasMoreUndo();
    }

    public Bitmap getBitmap(){
        return mBitmap;
    }


    public void surfaceChanged(SurfaceHolder holder, int format, int width,  int height) {
        // TODO Auto-generated method stub
        mBitmap =  Bitmap.createBitmap (width, height, Bitmap.Config.ARGB_8888);;
    }


    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        thread.setRunning(true);
        thread.start();
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        boolean retry = true;
        thread.setRunning(false);
        while (retry) {
            try {
                thread.join();
                retry = false;
            } catch (InterruptedException e) {
                // we will try it again and again...
            }
        }
    }

}
4

1 に答える 1

0

自分で簡単にして、アプリケーションを複数のサーフェスビューに分割してみませんか。ビューの順序を制御できるように、framelayout を使用します。タッチイベントを処理できるようにしたいと思います(ペイントプログラムですよね?)ので、あるビューでそれらを処理し、別のビューで描画を処理すると、コードがより管理しやすくなります。2 つのカスタム surfaceview を作成します (私の場合、1 つは GLSurfaceView で、もう 1 つは SurfaceView でした)。1 つのビューはイメージを実装し、2 つ目のビューはグラフィックやボタンを使用して GUI を処理できます。重要なのは、拡張されたSurfaceViewのクラス名を使用するXMLでカスタムGLSurfaceView(またはあなたの場合は2つのSurfaceview)を作成することです。また、GUI ビューを透明にする必要があります。したがって、描画クラスを呼び出してタッチ イベントを処理する Surface ビューは、次のようなコードになります。

public class MainSurfaceView extends GLSurfaceView
//Constructor
public MainSurfaceView(Context context, AttributeSet attrs) {       
    super(context, attrs);
    Log.d(TAG, "Constructor called...");
    this.context = context;

    mRenderer = new MainRenderer();
    setEGLConfigChooser(8, 8, 8, 8, 16, 0); 

    setRenderer(mRenderer);
    getHolder().setFormat(PixelFormat.TRANSLUCENT);    

    setZOrderOnTop(true);

    //Render only when there is a change
    setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);         
}

//TouchEvent handler
@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.d(TAG, "onTouchEvent called...");
    x = event.getX();
    y = event.getY();

    switch (event.getAction()) {
    case MotionEvent.ACTION_MOVE:

        float dx = x - mPreviousX;
        float dy = y - mPreviousY;

        //Reverse direction of rotation if above midline
        if (y > getHeight() / 2) {
            dx = dx * -1;
        }

        //Reverse direction of rotation if of the midline
        if (y < getWidth() / 2) {
            dy = dy * -1;
        }

        Main.mAngle += (dx + dy) * TOUCH_SCALE_FACTOR;

        TextView txtView = (TextView) ((Activity)context).findViewById(R.id.mangle);
        txtView.setText("Angle: " + String.valueOf(Main.mAngle));

        requestRender();
    }

    mPreviousX = x;
    mPreviousY = y;

    return true;
}

画像を別のサーフェス ビューに描画します (画像の変更も簡単になります)。したがって、Activity クラスには次のようなコードが含まれます (私の 2 番目のビューは GLsurfaceview であることに注意してください)。

 public class Main extends Activity {
 @Override
public void onCreate(Bundle savedInstanceState) {
    Log.d(TAG, "onCreate called...");
    Log.d(TAG, "state is: " + state.toString());
    super.onCreate(savedInstanceState);

    // When working with the camera, it's useful to stick to one orientation.
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

    //Set full screen
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.main);

    //Substantiate surfaces
    cameraView = (CameraView) findViewById(R.id.camera);
    mGLView = (MainSurfaceView) findViewById(R.id.glSurfaceView);        

    //Initialize TextViews
    txtView = (TextView) findViewById(R.id.mangle);
    txtView.setText("Angle: " + String.valueOf(mAngle)); 


    }
}

それが少し役立つことを願っています...

于 2012-06-28T11:25:00.060 に答える