1

更新関数に送信される水平サイズに応じて画像を特定のサイズにスケーリングしようとしていますが、次のコードでは画像のサイズが正しく設定されていないようです。

編集: コード:

public class GlassesView extends View {

    private Paint paint;
    private BitmapFactory.Options options;
    private Bitmap bitmapOrg;
    private Bitmap target;
    private Bitmap bitmapRev;
    private Bitmap resizedBitmap;

    private int currY;

    public int glassesX;
    public int glassesY;
    public float glassesSizeX;
    public float glassesSizeY;
    private boolean drawGlasses;
    private boolean glassesMirrored;

    public GlassesView(Context context) {
        super(context);
        paint = new Paint();
        paint.setDither(false);
        paint.setAntiAlias(false);

        options = new BitmapFactory.Options();
        options.inDither = false;
        options.inScaled = false;

        bitmapOrg = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(),
                R.drawable.micro_glasses, options), 32, 5, false);
        bitmapRev = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(),
                R.drawable.glasses_reverse, options), 32, 5, false);
        drawGlasses = false;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(target, 0, 0, paint);

        boolean moving = currY < glassesY;
        if (moving) {
            currY++;
        }
        if (drawGlasses) {
            int newWidth = resizedBitmap.getWidth();
            int newHeight = resizedBitmap.getHeight();
            Paint bluey = new Paint();
            bluey.setColor(Color.argb(64, 0, 0, 255));
            canvas.drawRect(new Rect(glassesX, currY, glassesX + newWidth,
                    currY + newHeight), bluey);

            canvas.drawBitmap(resizedBitmap, glassesX, currY, paint);
        }
        if (moving) {
            invalidate();
        }
    }

    public void drawGlasses(int x1, int x2, int y, boolean mirror) {
        drawGlasses = true;
        glassesMirrored = mirror;
        if (!mirror) {
            glassesSizeX = (float) (x2 - x1) / (float) (25 - 16);
            glassesSizeY = glassesSizeX;
            glassesY = y - (int)(1*glassesSizeX);
            glassesX = (int) (x1 - (glassesSizeX * 16));
        } else {
            glassesSizeX = (float) (x1 - x2) / (float) (25 - 16);
            glassesSizeY = glassesSizeX;
            glassesY = y - (int)(1*glassesSizeX);
            glassesX = (int) (x1 - (glassesSizeX * 16));
        }

        currY = -1;

        if (!glassesMirrored) {
            resizedBitmap = Bitmap.createScaledBitmap(bitmapOrg,
                    (int) (bitmapOrg.getWidth() * glassesSizeX),
                    (int) (bitmapOrg.getHeight() * glassesSizeY), false);
        } else {
            resizedBitmap = Bitmap.createScaledBitmap(bitmapRev,
                    (int) (bitmapRev.getWidth() * glassesSizeX),
                    (int) (bitmapRev.getHeight() * glassesSizeY), false);
        }
    }

    public void setTargetPic(Bitmap targetPic) {
        target = targetPic;
    }

}

結果。(青い四角形は、イメージの意図したサイズの境界ボックスです)

どの部分で間違っていますか?

編集 2: メガネは次のとおりです。眼鏡

編集 3: 好奇心から、実際の電話で実行したところ、まったく異なる結果が得られました。画像は、意図した青いボックスを通過して引き伸ばされました。

編集 4: Android バージョンの非互換性の問題かどうかを確認するために、いくつかのエミュレーターでアプリを実行してみましたが、それらはすべて完全に機能しているように見えました。スケーリングの問題は、私の携帯電話 (Vibrant、rooted、CM7) といとこの (Droid、同じく rooted) でのみ発生します。これらは私がテストした唯一の物理デバイスですが、どちらも同じ問題を抱えているようです。誰かがここで私を助けてくれたら本当にありがたいです.これは私のプロジェクトの大きな障害であり、他のフォーラムやメッセージグループは応答していません.

編集 5: アップデート 4 では、コードが少し変更され、前述のようにエミュレーターの問題が修正されましたが、物理デバイスでは機能しません。変更は上記のコードで更新されます。*必死に助けを求める* :P

編集 6: さらに別の更新として、古い G1 で同じコードをテストしましたが、期待どおりに完全に動作します。今はまったくわかりません。

4

3 に答える 3

1

/res/drawable-nodpi/ ディレクトリを使用して画像を保存していますか?

どうやら /drawable-ldpi/、/drawable-mdpi/、または /drawable-hdpi/ フォルダーを使用すると、Android は、デバイスに応じて、画像を読み込むときに画像にスケーリングを適用します。G1 が機能する理由は、使用したフォルダーによってはスケーリングが不要な場合があるためです。

また、IMGUR リンクが壊れています...また、コードが正しくないようです...引数なしで DrawGlasses を呼び出します。

于 2011-06-20T02:37:07.853 に答える
0

何が間違っているかを見つけました。画像は「drawable-nodpi」というフォルダーにある必要があります。そうでない場合、DPI に応じてスケーリングされます。

于 2011-06-20T05:28:02.770 に答える
0
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0, glassesWidth,   
                                           glassesHeight, matrix, false);

最後のパラメーターを false から true に変更します。試してみることができます。

以下は、スケールごとのズームイン方法を使用したものです。

 private void small()    {  
     int bmpWidth=bmp.getWidth();   
     int bmpHeight=bmp.getHeight();  

     Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);  

     /* 设置图片缩小的比例 */  
     double scale=0.8;  
     /* 计算出这次要缩小的比例 */   
     scaleWidth=(float) (scaleWidth*scale);   
     scaleHeight=(float) (scaleHeight*scale);   
     /* 产生reSize后的Bitmap对象 */  
     Matrix matrix = new Matrix();  
     matrix.postScale(scaleWidth, scaleHeight);  
     Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth,   
             bmpHeight,matrix,true);  
于 2011-06-13T03:59:11.437 に答える