1

背面の大きな背景である画像Aと、画像Aの上にマージされる小さなアイコンである画像Bの2つの画像があります.

使い方

ユーザーがカメラから写真を撮ると、この写真が画像 A になります。ユーザーがレイアウトからアイコンを選択すると、それが画像 B になります。画像 B の画像を選択した後、ユーザーは画像 B をレイアウト内で移動して調整できます。画像 B が画像 A の上に重なる位置。

ユーザーが保存を押した後、キャンバスは 2 つの画像 (A の上に B) をユーザーが望む位置にマージし、SD カードに保存します。

問題

画像Bをレイアウト内で移動させることはできましたが、画像Aの位置にマージする方法わかりません.

これは、画像Bをレイアウト内で移動させるために行ったことです。

img_additionalImage = (ImageView) findViewById(R.id.img_additionalImage);
    img_additionalImage.setOnTouchListener(new OnTouchListener()
    {
        @SuppressLint("NewApi")
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            switch (event.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                    isImageMoving = true;
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (isImageMoving)
                    {
                        x = event.getRawX() - img_additionalImage.getWidth() / 2;
                        y = event.getRawY() - img_additionalImage.getHeight() / 2;
                        img_additionalImage.setX(x);
                        img_additionalImage.setY(y);
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    isImageMoving = false;
                    break;
            }
            return true;
        }
    });

ユーザーが選択した位置で 2 つの画像をマージする方法がわかりません。

4

1 に答える 1

3

この 2 つのイメージビューの親レイアウトとして RealtiveLayout または LinearLayout を使用している場合は、この方法でそのビューをキャプチャできます..

view.setDrawingCacheEnabled(true);
Bitmap b = view.getDrawingCache();
b.compress(CompressFormat.JPEG, 95, new FileOutputStream("/some/location/image.jpg"));

ビューはあなたのビューです。95 は JPG 圧縮の品質です。そして、ファイル出力ストリームはまさにそれです。

setDrawaingCacheEnabled とは何ですか?

描画キャッシュを有効または無効にします。描画キャッシュが有効になっている場合、次に getDrawingCache() または buildDrawingCache() を呼び出すと、ビューがビットマップで描画されます。draw(android.graphics.Canvas) を呼び出しても、キャッシュが有効な場合はキャッシュから描画されません。キャッシュを利用するには、getDrawingCache() を呼び出して描画キャッシュを要求し、返されたビットマップが null でない場合は画面に描画する必要があります。

描画キャッシュを有効にすることは、ハードウェア アクセラレーションがオフになっているときにレイヤーを設定することに似ています。ハードウェア アクセラレーションがオンになっている場合、描画キャッシュを有効にしてもレンダリングには影響しません。これは、システムがフラグを無視する別のメカニズムをアクセラレーションに使用するためです。ハードウェア アクセラレーションが有効になっている場合でも、ビューにビットマップを使用する場合は、setLayerType(int, android.graphics.Paint) を参照して、ソフトウェア レイヤーとハードウェア レイヤーを有効にする方法を確認してください。

Android ドキュメントから

于 2014-01-01T07:17:24.270 に答える