動的に画像を動かしたり、サイズを拡大縮小するには、xmlのレイアウトではうまくいきません。拡大縮小などはコードで実装すると可能です。
2024.1.1
ImageViewをコードで記述
画像は通常は静的に貼り付けて終わりが多いのですが、レイアウトの関係でサイズを変えたり、アニメっぽくしたりする必要性が求められることがあります。基本的にはTextViewやButtonと同様の実装となります。
コード化のポイント
画像やボタンといったUI部品を配置するためには setContentView を使いますが、今回はレイアウトXMLファイルである activity_main.xml を使わないやり方です。
setContentView:
その名の通り、スクリーン画面にViewを設定するメソッドです。
設定されるViewはLayout形式でまとめられたViewグループになります。
setContentViewのメソッドは引数の取り方でいくつかあります
- setContentView(int layoutResID)
- レイアウトXMLファイルのIDを指定
- setContentView(View view)
- 簡略形です。今回はこれを使います
- setContentView(View view, ViewGroup.LayoutParams params)
Ref: Android Developer
Layoutのコード
setContentViewに設定するためのレイアウトを作成します。LayoutにはLiearLayoutやRelativeLayoutなどいくつかありますが、目的にあったものを選びます。今回はLiearLayoutです。ConstraintLayout は記述が多くなるので…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// リニアレイアウトのインスタンス生成 LinearLayout layout = new LinearLayout(this); // 垂直方向にレイアウト内のパーツを並べる設定とする layout.setOrientation(LinearLayout.VERTICAL); // レイアウトの縦横サイズをMATCH_PARENTにする layout.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); // レイアウト中央寄せ layout.setGravity(Gravity.CENTER); // setContentViewにlayoutを設定 setContentView(layout); |
ImageViewをコードで記述してLayoutに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// ImageViewのインスタンス生成 ImageView imageView = new ImageView(this); // drawableの画像を指定 imageView.setImageResource(R.drawable.img_2); // 元画像の1/2の縦横幅にする imageWidth = 300; imageHeight = 300; // 画像の縦横サイズをimageViewのサイズとして設定 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(imageWidth, imageHeight); imageView.setLayoutParams(layoutParams); // layoutにimageViewを追加 layout.addView(imageView); |
ボタンをタップすると縦横幅が+200pix増加するように設定していますが、この数値はpix値なので端末のサイズに適応するdpとは異なります。
1 2 3 |
// ボタンタップ毎に画像を拡大 imageWidth += 200; imageHeight += 200; |
サンプルコード
画像を適当に準備し \res\drawable 設定します。
あるいは \res\mipmap 以下にあるDroid君のアイコン画像をコピーして代用もできます。
MainActvity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
//package com.example.testimageviewcode; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import android.graphics.Color; import android.view.Gravity; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity { private LinearLayout.LayoutParams layoutParams; private ImageView imageView; private int imageWidth, imageHeight; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // EdgeToEdge.enable(this); // setContentView(R.layout.activity_main); // ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { // Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); // v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); // return insets; // }); // リニアレイアウトのインスタンス生成 LinearLayout layout = new LinearLayout(this); //垂直方向にレイアウト内のパーツを並べる設定とする layout.setOrientation(LinearLayout.VERTICAL); //レイアウトの縦横サイズをMATCH_PARENTにする layout.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)); // レイアウト中央寄せ layout.setGravity(Gravity.CENTER); // 背景色 layout.setBackgroundColor(Color.argb(0xff, 0xaa, 0xcc, 0xff)); //setContentViewにlayoutを設定 setContentView(layout); // ImageViewのインスタンス生成 imageView = new ImageView(this); imageView.setImageResource(R.drawable.img_2); // droid //imageView.setImageResource(R.drawable.ic_launcher); // 元画像の1/2 imageWidth = 300; imageHeight = 300; //画像の縦横サイズをimageViewのサイズとして設定 layoutParams = new LinearLayout.LayoutParams(imageWidth, imageHeight); imageView.setLayoutParams(layoutParams); //layoutにimageViewを追加 layout.addView(imageView); // ボタンの設定 Button button = new Button(this); String str = "Button"; button.setText(str); LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); button.setLayoutParams(buttonLayoutParams); layout.addView(button); // lambda button.setOnClickListener( v -> { // ボタンタップ毎に画像を拡大 imageWidth += 200; imageHeight += 200; layoutParams = new LinearLayout.LayoutParams(imageWidth, imageHeight); imageView.setLayoutParams(layoutParams); }); } } |
EdgeToEdgeなどは今回はずしておきます
使用した画像はdrawableに入れました。これはレイアウトファイルを使わず画像を拡大させる例ですが、画像を回転・移動・フリップそして拡大縮小させるにはMatrixを使う方が応用性があります。
関連:
- 画像の表示
- レイアウトファイルを使わずに画像表示
- 画像をドラッグする
- Matrixで画像を回転、フリップ、縮小させる
References:
setContentView
LinearLayout
LinearLayout.LayoutParams