teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

8

流れを整理した

2019/01/18 15:06

投稿

REIK727
REIK727

スコア23

title CHANGED
File without changes
body CHANGED
@@ -12,25 +12,38 @@
12
12
  ```Kotlin
13
13
  package com.example.myapplication
14
14
 
15
+ import android.graphics.Bitmap
16
+ import android.graphics.BitmapFactory
15
17
  import android.support.v7.app.AppCompatActivity
16
18
  import android.os.Bundle
19
+ import android.os.Environment
17
20
  import android.widget.ImageView
18
21
  import com.bumptech.glide.Glide
22
+ import kotlin.math.min
19
23
 
20
24
  class MainActivity : AppCompatActivity() {
21
25
 
22
26
  override fun onCreate(savedInstanceState: Bundle?) {
23
27
  super.onCreate(savedInstanceState)
24
28
  setContentView(R.layout.activity_main)
29
+ val view = findViewById<ImageView>(R.id.imageView)
25
30
 
26
- //(1)pngの場合
31
+ //pngの場合
32
+ view.setImageBitmap(
33
+ BitmapFactory.decodeFile(
27
- findViewById<ImageView>(R.id.imageView).setImageResource(R.drawable.pikachu_static)
34
+ Environment.getExternalStorageDirectory().path + "/MyApp/pikachu_static.png"
35
+ )
36
+ )
28
37
 
29
- //(2)gifの場合
38
+ //gifの場合
39
+ Glide
40
+ .with(this)
41
+ .load(
30
- //Glide.with(this).load(R.drawable.pikachu_dynamic).into(findViewById(R.id.imageView))
42
+ Environment.getExternalStorageDirectory().path + "/MyApp/pikachu_dynamic.gif"
43
+ )
44
+ .into(view)
31
45
  }
32
46
  }
33
-
34
47
  ```
35
48
  activity_main
36
49
  ```XML
@@ -42,42 +55,85 @@
42
55
  android:layout_width="match_parent"
43
56
  android:layout_height="match_parent"
44
57
  tools:context=".MainActivity">
58
+
45
59
  <ImageView
46
60
  android:layout_width="0dp"
61
+ android:layout_height="0dp"
47
- android:layout_height="0dp" tools:srcCompat="@tools:sample/avatars"
62
+ tools:srcCompat="@tools:sample/avatars"
48
63
  android:id="@+id/imageView"
49
64
  app:layout_constraintStart_toStartOf="parent"
50
65
  app:layout_constraintEnd_toEndOf="parent"
51
66
  app:layout_constraintTop_toTopOf="parent"
52
- app:layout_constraintBottom_toBottomOf="parent" android:layout_marginTop="24dp"
67
+ app:layout_constraintBottom_toBottomOf="parent"
68
+ android:layout_marginTop="24dp"
53
- android:layout_marginStart="24dp" android:layout_marginEnd="24dp"
69
+ android:layout_marginStart="24dp"
70
+ android:layout_marginEnd="24dp"
54
71
  android:layout_marginBottom="24dp"/>
55
72
  </android.support.constraint.ConstraintLayout>
56
73
  ```
57
74
  ### 試したこと
58
-
59
- (1)Vector Drawableにする
75
+ 1. Vector Drawableにする
60
76
  →ベクタ画像にしたことでぼやけは完全になくなったが、gifには使えない。
61
77
 
62
- (2)あらかじめ縦横の画素数を何倍かに増やしておく
78
+ 2. あらかじめ縦横の画素数を何倍かに増やしておく
63
79
  →ファイルサイズが大きくなるうえ、何倍に拡大すれば目立たなくなる程度のぼやけになるのかも決定できない。あまりスマートでないのでやりたくない。
64
80
 
65
- ~~(3)ImageViewをwrap_contentにした上で、Bitmap.createScaledBitmap()を使って動的に拡大したものを表示する
81
+ 3. Bitmap.createScaledBitmap()を使って動的に拡大したものを表示する
66
- filterをfalseすることぼやけをなくせる。しかしこの方法はGlideを使ってgifを表示するときは使えない。~~
82
+ 静止画はきれい表示る。しかしGlideを使ってgifを表示するときは使えない。
67
- ~~追記: 今やってみたらなぜか再現できませんでした...
83
+
68
- とりあえず今は無視してください。~~
84
+ Main Activity
69
- さらに追記: 再現できました。リソースから読み取ったBitmapの幅と高さが正しく読み取れていなかったのが原因でした。
70
85
  ```kotin
86
+ package com.example.myapplication
87
+
88
+ import android.graphics.Bitmap
89
+ import android.graphics.BitmapFactory
90
+ import android.os.Bundle
91
+ import android.os.Environment
92
+ import android.support.v7.app.AppCompatActivity
93
+ import android.view.ViewTreeObserver
94
+ import android.widget.ImageView
95
+ import kotlin.math.min
96
+
97
+ class MainActivity : AppCompatActivity() {
98
+
99
+ override fun onCreate(savedInstanceState: Bundle?) {
100
+ super.onCreate(savedInstanceState)
71
- val opt = BitmapFactory.Options()
101
+ setContentView(R.layout.activity_main)
72
- opt.inScaled = false //こうすることで正しく画素数を読み取れる
73
- val pikachu = BitmapFactory.decodeResource(resources, R.drawable.pikachu_static, opt)
74
- findViewById<ImageView>(R.id.imageView).setImageBitmap(
102
+ val view = findViewById<ImageView>(R.id.imageView)
103
+
104
+ view.viewTreeObserver.addOnGlobalLayoutListener(
105
+ object : ViewTreeObserver.OnGlobalLayoutListener {
106
+ override fun onGlobalLayout() {
107
+ //getResizedBitmap()はviewの幅と高さが決定してからでないと使えないためここで画像をセットする
75
- //10倍に拡大する
108
+ view.setImageBitmap(
109
+ getResizedBitmap(
110
+ BitmapFactory.decodeFile(
76
- Bitmap.createScaledBitmap(pikachu, pikachu.width * 10, pikachu.height * 10, false)
111
+ Environment.getExternalStorageDirectory().path + "/MyApp/pikachu_static.png"
112
+ ),
113
+ view
77
- )
114
+ )
115
+ )
116
+ //幅と高さだけ取得できれば用済みなのでリスナを削除
117
+ view.viewTreeObserver.removeOnGlobalLayoutListener(this)
118
+ }
119
+ }
120
+ )
121
+ }
122
+
123
+ //originalをviewに入る最大の大きさに拡大する。このときcreateScaledBitmap()のfilterにfalseを指定するとぼやけないっぽい。
124
+ fun getResizedBitmap(original: Bitmap, view: ImageView): Bitmap {
125
+ val magnification = min(view.width / original.width, view.height / original.height)
126
+ return Bitmap.createScaledBitmap(
127
+ original, original.width * magnification, original.height * magnification, false
128
+ )
129
+ }
130
+ }
78
131
  ```
132
+ activity_main
133
+ ```
134
+ さっきと一緒
135
+ ```
79
- ![イメージ説明](4920370c67043a3b99d0d25df2d5fadc.png)
136
+ ![イメージ説明](678a3f2f7895ca2bb884c7d27b39b661.png)
80
- しかし結局gifには使えません。
81
137
 
82
138
  ### 補足情報(FW/ツールのバージョンなど)
83
139
  android studioのバージョンは3.3、使用した実機及びエミュレータのOSは8.0、APIレベルは26です。

7

やや修正

2019/01/18 15:06

投稿

REIK727
REIK727

スコア23

title CHANGED
File without changes
body CHANGED
@@ -66,7 +66,7 @@
66
66
  →filterをfalseにすることでぼやけをなくせる。しかしこの方法はGlideを使ってgifを表示するときは使えない。~~
67
67
  ~~追記: 今やってみたらなぜか再現できませんでした...
68
68
  とりあえず今は無視してください。~~
69
- さらに追記: 解決しました。リソースから読み取ったBitmapの幅と高さが正しく読み取れていなかったのが原因でした。
69
+ さらに追記: 再現できました。リソースから読み取ったBitmapの幅と高さが正しく読み取れていなかったのが原因でした。
70
70
  ```kotin
71
71
  val opt = BitmapFactory.Options()
72
72
  opt.inScaled = false //こうすることで正しく画素数を読み取れる

6

やや追記

2019/01/16 14:20

投稿

REIK727
REIK727

スコア23

title CHANGED
File without changes
body CHANGED
@@ -77,6 +77,7 @@
77
77
  )
78
78
  ```
79
79
  ![イメージ説明](4920370c67043a3b99d0d25df2d5fadc.png)
80
+ しかし結局gifには使えません。
80
81
 
81
82
  ### 補足情報(FW/ツールのバージョンなど)
82
83
  android studioのバージョンは3.3、使用した実機及びエミュレータのOSは8.0、APIレベルは26です。

5

返事ができない旨を消去

2019/01/16 12:27

投稿

REIK727
REIK727

スコア23

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,3 @@
1
- **※私用で20:00ごろまで返事はできません。ご了承ください。**
2
-
3
1
  ### 前提・実現したいこと
4
2
 
5
3
  現在android studioでポケモン図鑑を作ろうとしています。

4

2019/01/16 11:09

投稿

REIK727
REIK727

スコア23

title CHANGED
File without changes
body CHANGED
@@ -58,7 +58,7 @@
58
58
  ```
59
59
  ### 試したこと
60
60
 
61
- (1)XMLにする
61
+ (1)Vector Drawableにする
62
62
  →ベクタ画像にしたことでぼやけは完全になくなったが、gifには使えない。
63
63
 
64
64
  (2)あらかじめ縦横の画素数を何倍かに増やしておく

3

返事ができない旨を追記

2019/01/16 07:20

投稿

REIK727
REIK727

スコア23

title CHANGED
File without changes
body CHANGED
@@ -1,3 +1,5 @@
1
+ **※私用で20:00ごろまで返事はできません。ご了承ください。**
2
+
1
3
  ### 前提・実現したいこと
2
4
 
3
5
  現在android studioでポケモン図鑑を作ろうとしています。

2

「試したこと」にさらに追記

2019/01/16 07:07

投稿

REIK727
REIK727

スコア23

title CHANGED
File without changes
body CHANGED
@@ -64,8 +64,19 @@
64
64
 
65
65
  ~~(3)ImageViewをwrap_contentにした上で、Bitmap.createScaledBitmap()を使って動的に拡大したものを表示する
66
66
  →filterをfalseにすることでぼやけをなくせる。しかしこの方法はGlideを使ってgifを表示するときは使えない。~~
67
- 今やってみたらなぜか再現できませんでした...
67
+ ~~追記: 今やってみたらなぜか再現できませんでした...
68
- とりあえず今は無視してください。
68
+ とりあえず今は無視してください。~~
69
+ さらに追記: 解決しました。リソースから読み取ったBitmapの幅と高さが正しく読み取れていなかったのが原因でした。
70
+ ```kotin
71
+ val opt = BitmapFactory.Options()
72
+ opt.inScaled = false //こうすることで正しく画素数を読み取れる
73
+ val pikachu = BitmapFactory.decodeResource(resources, R.drawable.pikachu_static, opt)
74
+ findViewById<ImageView>(R.id.imageView).setImageBitmap(
75
+ //10倍に拡大する
76
+ Bitmap.createScaledBitmap(pikachu, pikachu.width * 10, pikachu.height * 10, false)
77
+ )
78
+ ```
79
+ ![イメージ説明](4920370c67043a3b99d0d25df2d5fadc.png)
69
80
 
70
81
  ### 補足情報(FW/ツールのバージョンなど)
71
82
  android studioのバージョンは3.3、使用した実機及びエミュレータのOSは8.0、APIレベルは26です。

1

「試したこと」に追記

2019/01/16 06:36

投稿

REIK727
REIK727

スコア23

title CHANGED
File without changes
body CHANGED
@@ -62,8 +62,10 @@
62
62
  (2)あらかじめ縦横の画素数を何倍かに増やしておく
63
63
  →ファイルサイズが大きくなるうえ、何倍に拡大すれば目立たなくなる程度のぼやけになるのかも決定できない。あまりスマートでないのでやりたくない。
64
64
 
65
- (3)ImageViewをwrap_contentにした上で、Bitmap.createScaledBitmap()を使って動的に拡大したものを表示する
65
+ ~~(3)ImageViewをwrap_contentにした上で、Bitmap.createScaledBitmap()を使って動的に拡大したものを表示する
66
- →filterをfalseにすることでぼやけをなくせる。しかしこの方法はGlideを使ってgifを表示するときは使えない。
66
+ →filterをfalseにすることでぼやけをなくせる。しかしこの方法はGlideを使ってgifを表示するときは使えない。~~
67
+ 今やってみたらなぜか再現できませんでした...
68
+ とりあえず今は無視してください。
67
69
 
68
70
  ### 補足情報(FW/ツールのバージョンなど)
69
71
  android studioのバージョンは3.3、使用した実機及びエミュレータのOSは8.0、APIレベルは26です。