【Android】ボタン押下で ImageView の素材を加工する開発 スマホ備忘録

EngineeringAndroid, 備忘録, 職業訓練

【Android】ボタン押下で ImageView の素材を加工する開発 スマホ備忘録

MainActivity.java

public class MainActivity extends AppCompatActivity {  //  1
    final Activity activity = this; 
    /* 画像を加工表示するのに必要なMatrixクラスを準備する */
    final Matrix matrix = new Matrix();

    @Override
    protected void onCreate(Bundle savedInstanceState) {  //  2
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RadioGroup rg = (RadioGroup) activity.findViewById(R.id.radioGroup);
        final Spinner spinner1 = (Spinner) activity.findViewById(R.id.spinner1);
        spinner1.setSelection(1);
        final Spinner spinner2 = (Spinner) activity.findViewById(R.id.spinner2);
        spinner2.setSelection(1);
        final CheckBox check1 = (CheckBox) this.findViewById(R.id.checkBox1);
        final CheckBox check2 = (CheckBox) this.findViewById(R.id.checkBox2);
        final ImageView imageView = (ImageView) findViewById(R.id.imageView);
        final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample);
        final int imageWidth = bitmap.getWidth();
        final int imageHeight = bitmap.getHeight();

        final Bitmap bitmapMade = Bitmap.createBitmap(bitmap, 0, 0, imageWidth, imageHeight, matrix, true);

        /* 画像をビットマップに変換する getResources() = リソース用インスタンスを取得 */
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rock);
        // 画面上にあるImageView(@+id/imageView)のインスタンスを取得
        ImageView imageView = (ImageView) findViewById(R.id.imageView);

        // ビットマップの大きさを取得(回転させるときの基準点(どこを摘んで回転させるのか)に使う)
        int imageWidth = bitmap.getWidth();
        int imageHeight = bitmap.getHeight();

        /* radioButton */
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int id) {
                // チェックされているラジオボタンオブジェクトを取得
                RadioButton radio = (RadioButton) activity.findViewById(id);
                switch (radio.getId()) {
                    case R.id.radioButton1:
                        // 変化なしなので記述もなし
                        break;
                    case R.id.radioButton2:
                        /* 右回り・浮動小数で指定 jpgの回転は黒い隙間が生じる場合がある */
                        matrix.setRotate(90F, (float) imageWidth / 2, (float) imageHeight / 2);
                        break;
                    case R.id.radioButton3:
                        matrix.setRotate(180F, (float) imageWidth / 2, (float) imageHeight / 2);
                        break;
                    case R.id.radioButton4:
                        matrix.setRotate(270F, (float) imageWidth / 2, (float) imageHeight / 2);
                        break;
                }
            }
        });

        /* hanten 画像反転選択 個々に独立 */
        check1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                matrix.preScale(1, -1);
            }
        });
        check2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                matrix.preScale(-1, 1);
            }
        });
        /*
         * 画像の大きさを変更する ↑↓
         * matrix.preScale(x横軸(マイナスは横方向反転), y縦軸(マイナスは縦方向反転));
           matrix.preScale(1f, 1f);
           matrix.preScale(1.5f, 1.5f);
           matrix.preScale(-1f, 1f);
         */
        /* spinner 倍率選択 */
        spinner1.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String str = (String) spinner1.getSelectedItem();
                switch (str) {
                    case "0.5":
                        matrix.preScale(1.0f, 0.5f);  break;
                    case "1.0":
                        matrix.preScale(1.0f, 1.0f);  break;
                    case "1.5":
                        matrix.preScale(1.0f, 1.5f);  break;
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
        spinner2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                String str2 = (String) spinner2.getSelectedItem();
                switch (str2) {
                    case "0.5":
                        matrix.preScale(0.5f, 1.0f);  break;
                    case "1.0":
                        matrix.preScale(1.0f, 1.0f);  break;
                    case "1.5":
                        matrix.preScale(1.5f, 1.0f);  break;
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });

        /* Button */
        findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v){
                 Bitmap bitmapMade = Bitmap.createBitmap(bitmap, 0, 0, imageWidth, imageHeight, matrix, true);
                /*
                 * Bitmap画像を指定された加工を施してあたらなBitmap画像を作成する
                 * Bitmap : 加工するBitmap画像, int : 加工後の画像設定位置(横:px単位), int : 加工後の画像設定位置(縦:px単位),
                 * int : 加工後Bitmapの幅, int : 加工後Bitmapの高さ, Matrix : 加工内容, boolean : 画像の加工をした場合はtrue(らしい)
                */
                /* Bitmap bitmapMade = Bitmap.createBitmap(bitmap, 0, 0, imageWidth, imageHeight, matrix, true); */
                /* 画像をImageViewにセットする */
                imageView.setImageBitmap(bitmapMade);
            }
        });

    }  //  2  void on Create
}  //  1  class MainActivity extends AppCompatActivity

 

古いテキストには載ってないが、MainActivity は今ドキは “extends AppCompatActivity” を継承する。

やたら final 宣言が多い気がする。

 


 

EngineeringAndroid, 備忘録, 職業訓練

Posted by Qawai