3

http://www.windowsphone.com/en-gb/store/app/live-kaleidoscope/32e41ccf-5a25-42ea-84ff-07688f3e6aa5のようなライブKaleidoscopeアプリを作成しようとしています

このために、カメラのプレビューに対応するビットマップを取得することができました。三角形のパスからポリゴンを作成し、行列変換を使用してビットマップを操作した後、パスをビットマップで埋めようとしています。これらの変換にはまだ取り組んでいませんが、現在、ポリゴンとその中の画像すら見ていません。コードにエラーが発生していません。アプリケーションを実行すると、カメラが実行されているのがわかります。ハマった!助けてください!これが私のコードです:

パブリッククラスKaleidoscopeはViewを拡張します

{{

Bitmap imageData;
Canvas canvas1;
int picWidth, picHeight, ang, displayWidth, displayHeight, numOfsides;
float triangleSide, triangleHeight;

public Kaleidoscope(Context context) {
    super(context);
}

public Kaleidoscope(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public void init(Bitmap image, int sides, int w, int h) {

    numOfsides = sides;
    triangleSide = (w - 100) / 2;
    // triangleHeight=(float)Math.tan(Math.PI/3)*triangleSide/2;
    displayWidth = w;
    displayHeight = h;
    imageData = image;
    draw();
}

public void onDraw(Canvas canvas) {
    canvas1 = canvas;
}

public void draw() {

    float angle = 360 / numOfsides;
    float totalAngle = 0;
    float centerX = displayWidth / 2;
    float centerY = displayHeight / 2;
    float cornerX = centerX + triangleSide;
    float cornerY = centerY / 2;
    Matrix mat = new Matrix();

    mat.postTranslate(picWidth / 2, 0);

    // Matrix mat2=mat;
    //
    // float concatArray[]={-1,0,0,1,0,0};
    // Matrix concatMat=new Matrix();
    // concatMat.setValues(concatArray);
    // mat2.postConcat(concatMat);

    for (int i = 0; i < numOfsides; i++) {

        float verticalDistance = (triangleSide * (float) (Math.sin(Math
                .toRadians(totalAngle))));
        float horizontalDistance = (triangleSide * (float) (Math.cos(Math
                .toRadians(totalAngle))));

        float x = (displayWidth / 2) + horizontalDistance - (picWidth / 2);
        float y = (displayHeight / 2) + verticalDistance - (picHeight / 2);

        Path triangle = new Path();
        triangle.lineTo(cornerX, cornerY);
        triangle.lineTo(x, y);
        triangle.lineTo(centerX, centerY);
        cornerX = x;
        cornerY = y;
        totalAngle = totalAngle + angle;
        Bitmap matBitmap;

        if (i % 2 == 0) {
            matBitmap = Bitmap.createBitmap(imageData, 0, 0,
                    imageData.getWidth(), imageData.getHeight(), mat, true);
        } else {
            matBitmap = Bitmap.createBitmap(imageData, 0, 0,
                    imageData.getWidth(), imageData.getHeight(), mat, true);
        }

        BitmapShader fillBMPshader = new BitmapShader(matBitmap,
                Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
        Paint fill = new Paint();
        fill.setColor(0xFFFFFFFF);
        fill.setStyle(Paint.Style.FILL);
        fill.setShader(fillBMPshader);

        canvas1.drawPath(triangle, fill);

    }
}

}

4

1 に答える 1

0

最初に、私の英語の文章について申し訳ありません。(韓国人なので)

Android でカメラを使用する場合、名前付きのクラスpreviewが拡張SurfaceViewされて実装されSurfaceHolder.callbackます。

次にmainActivity、このクラスを呼び出します。右?

mainActivityクラスを呼び出した後、previewクラスを拡張する別のクラスを作成する必要がありますView

onDrawオーバーライド用に名前を付けたメソッドonDraw(Canvas canvas)を作成し、このメソッドでソースを次のように作成します。

mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setColor(Color.RED);
mPaint.setTextSize(40);
canvas.drawText("X", canvas.getWidth() / 2, canvas.getHeight() / 2, mPaint);

に戻ってmainActivity実行しますaddView

このソースの「ビュー クラス」の名前は「test」です。

final FrameLayout frame = (FrameLayout) findViewById(R.id.frame);
if (camview == null) {
    camview = new Preview(this);
    frame.addView(camview);
    test = new InvalidateTest(context);
    frame.addView(test, new LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
}

つまり、新しいクラスを作成し、このビューを (フレーム) レイアウトに追加するだけです。

于 2013-02-26T11:17:03.397 に答える