前提・実現したいこと
AndroidアプリでSeekbarの値に応じて円の半径を変えようとしています。
Seekbarの実装で参考にしているのは、以下のサイトです。
[Android & Kotlin] ボリューム入力ができるSeekBar
発生している問題・エラーメッセージ
Seekbarの表示と円の描画はそれぞれできているのですが、Seekbarの値に応じて円の半径を変える実装ができずに困っています。
現在のコードだとエラーは出ずにビルドやエミュレータで実行できますが、半径を変化させたい円も、初期値のまま変化しません。
黄色の円の半径を、seekbarの値に応じて変化させるには現在のコードをどのように修正すれば良いでしょうか。
該当のソースコード
MainActivity.kt
kotlin
1import android.graphics.Bitmap 2import android.graphics.Canvas 3import android.graphics.Color 4import android.graphics.Paint 5import android.graphics.drawable.BitmapDrawable 6import android.os.Bundle 7import android.widget.SeekBar 8import androidx.appcompat.app.AppCompatActivity 9import kotlinx.android.synthetic.main.activity_main.* 10import java.util.* 11 12class MainActivity : AppCompatActivity() { 13 14 override fun onCreate(savedInstanceState: Bundle?) { 15 super.onCreate(savedInstanceState) 16 setContentView(R.layout.activity_main) 17 18 //seekbar 19 seekbar.setProgress(0) 20 seekbar.setMax(100) 21 22 //円の半径初期値 23 var num: Int = 100 24 25 seekbar.setOnSeekBarChangeListener( 26 object : SeekBar.OnSeekBarChangeListener { 27 28 override fun onProgressChanged( 29 seekBar: SeekBar, progress: Int, fromUser: Boolean 30 ) { 31 //ここでseekbarの数字を代入したい 32 num = progress 33 34 val str = String.format(Locale.US, "%d %%", progress) 35 percent.text = str //percentage which user setted 36 } 37 38 39 override fun onStartTrackingTouch(seekBar: SeekBar) { 40 // called when a knob is touched 41 } 42 43 override fun onStopTrackingTouch(seekBar: SeekBar) { 44 // called when a knob is released 45 } 46 47 }) 48 49 //円の描画 50 val bitmap: Bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888) 51 val canvas: Canvas = Canvas(bitmap) 52 53 var paint1 = Paint() 54 paint1.setColor(Color.parseColor("#F5FF5F")) 55 paint1.setAntiAlias(true) 56 paint1.setDither(true) 57 58 //変化しない円 59 var paint2 = Paint() 60 paint2.setColor(Color.parseColor("#c6142d")) 61 paint2.setAntiAlias(true) 62 paint2.setDither(true) 63 64 65 //半径が変化する円 66 var center_x = (150).toFloat() 67 var center_y = (150).toFloat() 68 var radius = (num).toFloat() 69 70 71 canvas.drawCircle(center_x, center_y, (120).toFloat(), paint2) 72 canvas.drawCircle(center_x, center_y, radius, paint1) 73 74 // set bitmap as background to ImageView 75 imageV.background = BitmapDrawable(getResources(), bitmap) 76 77 } 78} 79
activity_main.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:background="#F7F3F5" 8 android:orientation="vertical" 9 android:gravity="center" 10 tools:context=".MainActivity"> 11 12 13 <ImageView 14 android:id="@+id/imageV" 15 android:layout_width="350dp" 16 android:layout_height="350dp"/> 17 18 <TextView 19 android:id="@+id/percent" 20 android:padding="10dp" 21 android:layout_width="match_parent" 22 android:layout_height="wrap_content" 23 android:layout_margin="10dp" 24 android:gravity="center" 25 android:textColor="#000" 26 android:textSize="20sp" /> 27 28 <SeekBar 29 android:id="@+id/seekbar" 30 android:layout_width="match_parent" 31 android:layout_height="60dp" 32 android:layout_margin="10dp" 33 android:background="#ccc" 34 android:gravity="center" 35 android:padding="20dp" /> 36 37 38 39</LinearLayout>
試したこと
val str = String.format(Locale.US, "%d %%", progress) percent.text = str //percentage which user setted
として、seekbarの値は数値として、progress
でInt型で取得できていることはわかっています。
補足情報(FW/ツールのバージョンなど)
Android Studio 3.6.1
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/03/23 06:38
2020/03/23 06:41