実現したいこと
カスタムボタンの完璧な配置
前提
android studio,javaで開発しています
発生している問題
カスタムボタンをグリッドレイアウトに動的にたくさん配置しているのですが、ボタンにテキストを設定すると、ボタンとボタンの間に不自然な隙間ができます。これをなくしたいです。
問題の画像
画像では誇張してテキストを大きくしていますが、10dp程度でも、数ピクセルの隙間ができてしまいます。
もっと小さくすると隙間が発生しないですが、視認性が落ちるので困っています。
試したこと
テキストの大きさによって空白の大きさも変わります。
マージン関連の属性のせいなのかと思い、すべて変更し確認してみましたが効果はありませんでした。
ボタンの大きさを大きくすると空白が生じ始める最小のテキストの大きさも大きくなります。
ソースコード 追記
java
1package com.example.myapplication; 2 3import android.content.Context; 4import android.graphics.Color; 5import android.graphics.drawable.GradientDrawable; 6import android.os.Bundle; 7import android.view.MotionEvent; 8 9import androidx.appcompat.app.AppCompatActivity; 10import androidx.appcompat.widget.AppCompatButton; 11import androidx.constraintlayout.widget.ConstraintLayout; 12import androidx.gridlayout.widget.GridLayout; 13 14public class MainActivity extends AppCompatActivity { 15@Override 16protected void onCreate(Bundle savedInstanceState) { 17super.onCreate(savedInstanceState); 18setContentView(R.layout.main); 19ConstraintLayout constraintLayout = findViewById(R.id.constraint); 20 21constraintLayout.post(() -> { 22GridLayout gridLayout = findViewById(R.id.grid); 23 24int column = gridLayout.getColumnCount(); 25int row = gridLayout.getRowCount(); 26 27int width = constraintLayout.getWidth() / column; 28int height = constraintLayout.getHeight() / row; 29int btnSize = 150; 30int widthMargin = (width-btnSize) / 2; 31int heightMargin = (height-btnSize) / 2; 32 33String[] note = {"あ", "あ", "", "あ", "あ"}; 34for (int i = 0; i < column * row; i++) { 35GridLayout.LayoutParams params = new GridLayout.LayoutParams(); 36params.width = params.height = btnSize; 37params.columnSpec = GridLayout.spec(i % column, 1); 38params.rowSpec = GridLayout.spec(i / column, 1); 39 40params.setMargins(widthMargin, heightMargin, widthMargin, heightMargin); 41 42CircleButton button = new CircleButton(this,Color.WHITE, btnSize); 43button.setLayoutParams(params); 44button.setId(i); 45button.setText(i % column < note.length ? note[i % column] : null); 46button.setOnClickListener(v -> { 47 48}); 49 50gridLayout.addView(button); 51} 52}); 53} 54 55public static class CircleButton extends AppCompatButton { 56public CircleButton(Context context,int color, int size) { 57super(context); 58GradientDrawable drawable = new GradientDrawable(); 59drawable.setShape(GradientDrawable.OVAL); 60drawable.setColor(color); 61setBackground(drawable); 62 63setPadding(0, 0, 0, 0); 64setMinWidth(size); 65setMinHeight(size); 66setTextSize(100); 67} 68 69@Override 70public boolean onTouchEvent(MotionEvent event) { 71int centerX = getWidth() / 2; 72int centerY = getHeight() / 2; 73int radius = getWidth() / 2; 74 75if (event.getActionMasked() == MotionEvent.ACTION_DOWN && (float) Math.sqrt(Math.pow(event.getX() - centerX, 2) + Math.pow(event.getY() - centerY, 2)) > radius) { 76if (event.getAction() == MotionEvent.ACTION_UP) performClick(); 77return false; 78} 79 80return super.onTouchEvent(event); 81} 82 83@Override 84public boolean performClick() { 85return super.performClick(); 86} 87} 88} 89
xml
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3xmlns:app="http://schemas.android.com/apk/res-auto" 4android:id="@+id/constraint" 5android:layout_width="match_parent" 6android:layout_height="match_parent"> 7 8<androidx.gridlayout.widget.GridLayout 9android:id="@+id/grid" 10android:layout_width="0dp" 11android:layout_height="0dp" 12android:background="#787878" 13app:columnCount="5" 14app:layout_constraintBottom_toBottomOf="parent" 15app:layout_constraintEnd_toEndOf="parent" 16app:layout_constraintStart_toStartOf="parent" 17app:layout_constraintTop_toTopOf="parent" 18app:rowCount="5"> 19 20</androidx.gridlayout.widget.GridLayout> 21</androidx.constraintlayout.widget.ConstraintLayout>
追加で分かったことがあるので記しておきます。
・ボタンのテキストに何も記述しない列がないと起こらない
・テキストが英文字であると起こらない(かな、カナであると起こる)
・英文字である列とかなである列が混在していても起こる
どうやらテキストが関係していそうです。
回答2件
あなたの回答
tips
プレビュー