3

1つの画像の20のコピーからリングを作成しようとしています。これは、リング全体の1/20スライスです。この元の画像を正しい角度に回転させたビットマップを生成します。元の画像は130x130の正方形です

元のスライス

回転したスライスを生成するコードは次のようになります。

Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.battery_green);
    FileOutputStream fos;
    for(int i = 0; i < 20; i++) {
        String idName = "batt_s_"+i;
        Matrix m = new Matrix();
        m.setRotate((i * 18)-8, bmp.getWidth()/2, bmp.getHeight()/2);

        Bitmap newBmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), m, true);
        try {
            fos = context.openFileOutput(idName+"_"+color+".png", Context.MODE_WORLD_READABLE);
            newBmp.compress(CompressFormat.PNG, 100, fos);
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        m.reset();
        BattConfigureSmall.saveInitPref(context, true);
    }

これらの生成されたビットマップが最終的にすべてにスロットされるImageViewには、XMLにscaleType="center"が含まれています。ただし、生成される出力は次のようになります。

ここに画像の説明を入力してください

完全なリングではありません。APIレベル11以上では、これらのImageViewでandroid:rotate XML属性を使用しているため、スライス自体は正しく回転すると完全なリングになりますが、APIレベル7〜10もサポートする必要があります。誰か私にアドバイスをくれますか?ありがとうございました。

4

1 に答える 1

1

このシナリオではマトリックスを使用しないでくださいcreateBitmap。画像のサイズ設定で奇妙なことが起こると思います。代わりに、新しいものを作成しBitmapCanvasから、マトリックスを使用してそれに描画します。

Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.battery_green);
FileOutputStream fos;
Paint paint = new Paint();
paint.setAntiAlias(true);
Matrix m = new Matrix();

for(int i = 0; i < 20; i++) {
    String idName = "batt_s_"+i;
    m.setRotate((i * 18)-8, bmp.getWidth()/2, bmp.getHeight()/2);

    Bitmap newBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(newBmp);
    canvas.drawBitmap(bmp, m, paint);

    try {
        fos = context.openFileOutput(idName+"_"+color+".png", Context.MODE_WORLD_READABLE);
        newBmp.compress(CompressFormat.PNG, 100, fos);
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    m.reset();
    BattConfigureSmall.saveInitPref(context, true);
}
于 2013-01-05T01:02:31.513 に答える