0

インテントを使用してSDカードから画像を取得しようとしています

Intent choosePictureIntent = new Intent(Intent.ACTION_PICK,
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(choosePictureIntent, 0);

これを使うことで

BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();

bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(
    imageFileUri), null, bmpFactoryOptions);
chosenImageView.setImageBitmap(bmp);

chosenImageViewを参照してImageViewいますが、 を使用しようとするSurfaceViewと、 が表示されません.setImageBitmap

イメージを理解する方法は知っていますimageViewSurface、コンセプトを理解するのは難しいと感じています。

4

1 に答える 1

0

SurfaceView静的を作成するArrayListか、ビットマップVectorを保存して描画する必要がありますBitmaponDraw

public class Panle extends SurfaceView implements SurfaceHolder.Callback {
    private static ArrayList<Bitmap> mElements;
    private CanvasThread canvasThread;
    private Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

    public Panle(Context context) {
        super(context);
        mElements = new ArrayList<Bitmap>();
        getHolder().addCallback(this);
        canvasThread = new CanvasThread(getHolder(), this);

        p.setXfermode(new PorterDuffXfermode(Mode.SRC));
        p.setColor(Color.TRANSPARENT);
        p.setMaskFilter(new BlurMaskFilter(15, Blur.NORMAL));
    }

    @Override
    public void draw(Canvas canvas) {
        if (canvas != null)
            canvas.drawColor(0xffffffff);
        if (mElements != null && mElements.size() != 0) {

            for (int i = 0; i <= mElements.size() - 1; i++) {

                canvas.drawBitmap(mElements.get(i), 50, 50, p);// For example i fixed position at 50 50. You can change to another position

            }

        }

        super.draw(canvas);
    }
public static ArrayList<Bitmap> setmElements() {
    return mElements;
}

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if (!canvasThread.isAlive()) {
            canvasThread = new CanvasThread(getHolder(), this);
            canvasThread.setRunning(true);
            canvasThread.start();
        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        if (canvasThread.isAlive()) {
            canvasThread.setRunning(false);
        }

    }

}

次に、パネル クラスでスレッドを処理する必要があります。

public class CanvasThread extends Thread {
    private SurfaceHolder _surfaceHolder;
    private Panle _panel;
    private boolean _run = false;

    public CanvasThread(SurfaceHolder surfaceHolder, Panle panel) {
        _surfaceHolder = surfaceHolder;
        _panel = panel;
    }

    public void setRunning(boolean run) {
        _run = run;
    }
    public SurfaceHolder getSurfaceHolder() {
        return _surfaceHolder;
    }

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

                    _panel.onDraw(c);
                }
            } finally {
                // do this in a finally so that if an exception is thrown
                // during the above, we don't leave the Surface in an
                // inconsistent state
                if (c != null) {
                    _surfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
    }
}

xml でパネルを作成し、アクティビティで取得します。Intent を使用して Gallery を開き、画像を描画するためにSDcard、これを使用して、取得した画像を onActivityForResult に入れます。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode == RESULT_OK) {

            if (requestCode == Constants.REQUEST_CODE_GETTING_IMAGE) {

                if (data != null) {

                    Uri dataUri = data.getData();
                    Bitmap bitmap = null;
                    bitmap = Utils.decodeSampledBitmapFromFile(ImageUtil.getRealPathFromURI(CheDetailActivity.this, dataUri), Panel.getPanelW(), Panel.getPanelH());// I resize image from Gallery to avoid OOM
                    if (bitmap != null) {


                        Panel.getmElements().add(bitmap);
                    }

                }
            }

        }
        super.onActivityResult(requestCode, resultCode, data);
    }

あなたPanel.getElements.add(bitmap);
が見ることができる別のチュートリアルは、非常に基本的な手順を示す2D チュートリアル シリーズです。

于 2012-11-01T07:34:36.770 に答える