質問編集履歴

8

流れを整理した

2019/01/18 15:06

投稿

REIK727
REIK727

スコア23

test CHANGED
File without changes
test CHANGED
@@ -26,14 +26,22 @@
26
26
 
27
27
 
28
28
 
29
+ import android.graphics.Bitmap
30
+
31
+ import android.graphics.BitmapFactory
32
+
29
33
  import android.support.v7.app.AppCompatActivity
30
34
 
31
35
  import android.os.Bundle
32
36
 
37
+ import android.os.Environment
38
+
33
39
  import android.widget.ImageView
34
40
 
35
41
  import com.bumptech.glide.Glide
36
42
 
43
+ import kotlin.math.min
44
+
37
45
 
38
46
 
39
47
  class MainActivity : AppCompatActivity() {
@@ -46,24 +54,42 @@
46
54
 
47
55
  setContentView(R.layout.activity_main)
48
56
 
49
-
57
+ val view = findViewById<ImageView>(R.id.imageView)
50
-
58
+
59
+
60
+
51
- //(1)pngの場合
61
+ //pngの場合
62
+
52
-
63
+ view.setImageBitmap(
64
+
65
+ BitmapFactory.decodeFile(
66
+
53
- findViewById<ImageView>(R.id.imageView).setImageResource(R.drawable.pikachu_static)
67
+ Environment.getExternalStorageDirectory().path + "/MyApp/pikachu_static.png"
68
+
54
-
69
+ )
70
+
55
-
71
+ )
56
-
72
+
73
+
74
+
57
- //(2)gifの場合
75
+ //gifの場合
76
+
58
-
77
+ Glide
78
+
79
+ .with(this)
80
+
81
+ .load(
82
+
59
- //Glide.with(this).load(R.drawable.pikachu_dynamic).into(findViewById(R.id.imageView))
83
+ Environment.getExternalStorageDirectory().path + "/MyApp/pikachu_dynamic.gif"
84
+
85
+ )
86
+
87
+ .into(view)
60
88
 
61
89
  }
62
90
 
63
91
  }
64
92
 
65
-
66
-
67
93
  ```
68
94
 
69
95
  activity_main
@@ -86,11 +112,15 @@
86
112
 
87
113
  tools:context=".MainActivity">
88
114
 
115
+
116
+
89
117
  <ImageView
90
118
 
91
119
  android:layout_width="0dp"
92
120
 
121
+ android:layout_height="0dp"
122
+
93
- android:layout_height="0dp" tools:srcCompat="@tools:sample/avatars"
123
+ tools:srcCompat="@tools:sample/avatars"
94
124
 
95
125
  android:id="@+id/imageView"
96
126
 
@@ -100,9 +130,13 @@
100
130
 
101
131
  app:layout_constraintTop_toTopOf="parent"
102
132
 
103
- app:layout_constraintBottom_toBottomOf="parent" android:layout_marginTop="24dp"
133
+ app:layout_constraintBottom_toBottomOf="parent"
134
+
104
-
135
+ android:layout_marginTop="24dp"
136
+
105
- android:layout_marginStart="24dp" android:layout_marginEnd="24dp"
137
+ android:layout_marginStart="24dp"
138
+
139
+ android:layout_marginEnd="24dp"
106
140
 
107
141
  android:layout_marginBottom="24dp"/>
108
142
 
@@ -112,51 +146,129 @@
112
146
 
113
147
  ### 試したこと
114
148
 
115
-
116
-
117
- (1)Vector Drawableにする
149
+ 1. Vector Drawableにする
118
150
 
119
151
  →ベクタ画像にしたことでぼやけは完全になくなったが、gifには使えない。
120
152
 
121
153
 
122
154
 
123
- (2)あらかじめ縦横の画素数を何倍かに増やしておく
155
+ 2. あらかじめ縦横の画素数を何倍かに増やしておく
124
156
 
125
157
  →ファイルサイズが大きくなるうえ、何倍に拡大すれば目立たなくなる程度のぼやけになるのかも決定できない。あまりスマートでないのでやりたくない。
126
158
 
127
159
 
128
160
 
129
- ~~(3)ImageViewをwrap_contentにした上で、Bitmap.createScaledBitmap()を使って動的に拡大したものを表示する
161
+ 3. Bitmap.createScaledBitmap()を使って動的に拡大したものを表示する
130
-
162
+
131
- filterをfalseすることぼやけをなくせる。しかしこの方法はGlideを使ってgifを表示するときは使えない。~~
163
+ 静止画はきれい表示る。しかしGlideを使ってgifを表示するときは使えない。
132
-
133
- ~~追記: 今やってみたらなぜか再現できませんでした...
164
+
134
-
165
+
166
+
135
- とりあえず今は無視してください。~~
167
+ Main Activity
136
-
137
- さらに追記: 再現できました。リソースから読み取ったBitmapの幅と高さが正しく読み取れていなかったのが原因でした。
138
168
 
139
169
  ```kotin
140
170
 
171
+ package com.example.myapplication
172
+
173
+
174
+
175
+ import android.graphics.Bitmap
176
+
177
+ import android.graphics.BitmapFactory
178
+
179
+ import android.os.Bundle
180
+
181
+ import android.os.Environment
182
+
183
+ import android.support.v7.app.AppCompatActivity
184
+
185
+ import android.view.ViewTreeObserver
186
+
187
+ import android.widget.ImageView
188
+
189
+ import kotlin.math.min
190
+
191
+
192
+
193
+ class MainActivity : AppCompatActivity() {
194
+
195
+
196
+
197
+ override fun onCreate(savedInstanceState: Bundle?) {
198
+
199
+ super.onCreate(savedInstanceState)
200
+
141
- val opt = BitmapFactory.Options()
201
+ setContentView(R.layout.activity_main)
142
-
143
- opt.inScaled = false //こうすることで正しく画素数を読み取れる
202
+
144
-
145
- val pikachu = BitmapFactory.decodeResource(resources, R.drawable.pikachu_static, opt)
146
-
147
- findViewById<ImageView>(R.id.imageView).setImageBitmap(
203
+ val view = findViewById<ImageView>(R.id.imageView)
204
+
205
+
206
+
148
-
207
+ view.viewTreeObserver.addOnGlobalLayoutListener(
208
+
209
+ object : ViewTreeObserver.OnGlobalLayoutListener {
210
+
211
+ override fun onGlobalLayout() {
212
+
213
+ //getResizedBitmap()はviewの幅と高さが決定してからでないと使えないためここで画像をセットする
214
+
149
- //10倍に拡大する
215
+ view.setImageBitmap(
216
+
150
-
217
+ getResizedBitmap(
218
+
219
+ BitmapFactory.decodeFile(
220
+
151
- Bitmap.createScaledBitmap(pikachu, pikachu.width * 10, pikachu.height * 10, false)
221
+ Environment.getExternalStorageDirectory().path + "/MyApp/pikachu_static.png"
222
+
152
-
223
+ ),
224
+
225
+ view
226
+
153
- )
227
+ )
228
+
154
-
229
+ )
230
+
231
+ //幅と高さだけ取得できれば用済みなのでリスナを削除
232
+
233
+ view.viewTreeObserver.removeOnGlobalLayoutListener(this)
234
+
235
+ }
236
+
237
+ }
238
+
239
+ )
240
+
241
+ }
242
+
243
+
244
+
245
+ //originalをviewに入る最大の大きさに拡大する。このときcreateScaledBitmap()のfilterにfalseを指定するとぼやけないっぽい。
246
+
247
+ fun getResizedBitmap(original: Bitmap, view: ImageView): Bitmap {
248
+
249
+ val magnification = min(view.width / original.width, view.height / original.height)
250
+
251
+ return Bitmap.createScaledBitmap(
252
+
253
+ original, original.width * magnification, original.height * magnification, false
254
+
255
+ )
256
+
257
+ }
258
+
259
+ }
260
+
155
- ```
261
+ ```
262
+
156
-
263
+ activity_main
264
+
265
+ ```
266
+
267
+ さっきと一緒
268
+
269
+ ```
270
+
157
- ![イメージ説明](4920370c67043a3b99d0d25df2d5fadc.png)
271
+ ![イメージ説明](678a3f2f7895ca2bb884c7d27b39b661.png)
158
-
159
- しかし結局gifには使えません。
160
272
 
161
273
 
162
274
 

7

やや修正

2019/01/18 15:06

投稿

REIK727
REIK727

スコア23

test CHANGED
File without changes
test CHANGED
@@ -134,7 +134,7 @@
134
134
 
135
135
  とりあえず今は無視してください。~~
136
136
 
137
- さらに追記: 解決しました。リソースから読み取ったBitmapの幅と高さが正しく読み取れていなかったのが原因でした。
137
+ さらに追記: 再現できました。リソースから読み取ったBitmapの幅と高さが正しく読み取れていなかったのが原因でした。
138
138
 
139
139
  ```kotin
140
140
 

6

やや追記

2019/01/16 14:20

投稿

REIK727
REIK727

スコア23

test CHANGED
File without changes
test CHANGED
@@ -156,6 +156,8 @@
156
156
 
157
157
  ![イメージ説明](4920370c67043a3b99d0d25df2d5fadc.png)
158
158
 
159
+ しかし結局gifには使えません。
160
+
159
161
 
160
162
 
161
163
  ### 補足情報(FW/ツールのバージョンなど)

5

返事ができない旨を消去

2019/01/16 12:27

投稿

REIK727
REIK727

スコア23

test CHANGED
File without changes
test CHANGED
@@ -1,7 +1,3 @@
1
- **※私用で20:00ごろまで返事はできません。ご了承ください。**
2
-
3
-
4
-
5
1
  ### 前提・実現したいこと
6
2
 
7
3
 

4

2019/01/16 11:09

投稿

REIK727
REIK727

スコア23

test CHANGED
File without changes
test CHANGED
@@ -118,7 +118,7 @@
118
118
 
119
119
 
120
120
 
121
- (1)XMLにする
121
+ (1)Vector Drawableにする
122
122
 
123
123
  →ベクタ画像にしたことでぼやけは完全になくなったが、gifには使えない。
124
124
 

3

返事ができない旨を追記

2019/01/16 07:20

投稿

REIK727
REIK727

スコア23

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,7 @@
1
+ **※私用で20:00ごろまで返事はできません。ご了承ください。**
2
+
3
+
4
+
1
5
  ### 前提・実現したいこと
2
6
 
3
7
 

2

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

2019/01/16 07:07

投稿

REIK727
REIK727

スコア23

test CHANGED
File without changes
test CHANGED
@@ -130,9 +130,31 @@
130
130
 
131
131
  →filterをfalseにすることでぼやけをなくせる。しかしこの方法はGlideを使ってgifを表示するときは使えない。~~
132
132
 
133
- 今やってみたらなぜか再現できませんでした...
133
+ ~~追記: 今やってみたらなぜか再現できませんでした...
134
134
 
135
- とりあえず今は無視してください。
135
+ とりあえず今は無視してください。~~
136
+
137
+ さらに追記: 解決しました。リソースから読み取ったBitmapの幅と高さが正しく読み取れていなかったのが原因でした。
138
+
139
+ ```kotin
140
+
141
+ val opt = BitmapFactory.Options()
142
+
143
+ opt.inScaled = false //こうすることで正しく画素数を読み取れる
144
+
145
+ val pikachu = BitmapFactory.decodeResource(resources, R.drawable.pikachu_static, opt)
146
+
147
+ findViewById<ImageView>(R.id.imageView).setImageBitmap(
148
+
149
+ //10倍に拡大する
150
+
151
+ Bitmap.createScaledBitmap(pikachu, pikachu.width * 10, pikachu.height * 10, false)
152
+
153
+ )
154
+
155
+ ```
156
+
157
+ ![イメージ説明](4920370c67043a3b99d0d25df2d5fadc.png)
136
158
 
137
159
 
138
160
 

1

「試したこと」に追記

2019/01/16 06:36

投稿

REIK727
REIK727

スコア23

test CHANGED
File without changes
test CHANGED
@@ -126,9 +126,13 @@
126
126
 
127
127
 
128
128
 
129
- (3)ImageViewをwrap_contentにした上で、Bitmap.createScaledBitmap()を使って動的に拡大したものを表示する
129
+ ~~(3)ImageViewをwrap_contentにした上で、Bitmap.createScaledBitmap()を使って動的に拡大したものを表示する
130
130
 
131
- →filterをfalseにすることでぼやけをなくせる。しかしこの方法はGlideを使ってgifを表示するときは使えない。
131
+ →filterをfalseにすることでぼやけをなくせる。しかしこの方法はGlideを使ってgifを表示するときは使えない。~~
132
+
133
+ 今やってみたらなぜか再現できませんでした...
134
+
135
+ とりあえず今は無視してください。
132
136
 
133
137
 
134
138