1

我有一个带有四个按钮的自定义视图。我在 Java 中创建了视图,因为我想为按钮设置动画。我想将按钮上的文本居中,但我只能水平(左右)而不是垂直地做到这一点。文字贴在顶部。

这是我可以使用的最基本的代码:

public class CopyOfGameView extends ViewGroup implements View.OnClickListener {

    private Main main;

    public CopyOfGameView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CopyOfGameView(Context context) {
        super(context);
    }

    public void reset(Main main) {
        this.main = main;
        removeAllViews();

        for (int c = 0; c < 4; c++) {
            ButtonView buttonView = new ButtonView(getContext(), c);
            buttonView.setText("x");
            buttonView.setTextSize(6);
            buttonView.setGravity(Gravity.CENTER);
            addView(buttonView);
        }
    }
        @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int w = getWidth();
        int h = getHeight();
        int oneFourth = h / 4;

        int count = getChildCount();
        for (int i = 0; i < count; i++) {
            ButtonView buttonView = (ButtonView) getChildAt(i);
            int left = 0;
            int top = oneFourth * buttonView.getRow();
            int right = w;
            int bottom = oneFourth * buttonView.getRow() + oneFourth;
            buttonView.layout(left, top, right, bottom);
        }
    }

    public void onClick(View v) {}

    protected ButtonView findButtonView(int row) {
        int count = getChildCount();
        for (int i = 0; i < count; i++) {
            View v = getChildAt(i);
            if (v instanceof ButtonView) {
                ButtonView buttonView = (ButtonView) v;
                if (buttonView.getRow() == row) {
                    return buttonView;
                }
            }
        }
        return null;
    }

    protected class ButtonView extends Button {
        private int row;

        protected ButtonView(Context context, int row) {
            super(context);
            this.row = row;

            Drawable image = getResources().getDrawable(R.drawable.btn_black);
            setBackgroundDrawable(image);
            setClickable(true);
            setOnClickListener(CopyOfGameView.this);
        }

        public int getRow() {
            return row;
        }

        public void setRow(int row) {
            this.row = row;
        }
    }
}

这是正常的还是Android中的错误?如何使文本垂直居中?

4

4 回答 4

1

该项目以另一个名称重新启动,并且凭借一年的经验,我能够解决问题。我还实现了 AutoResizeTextView,因为它适合项目。我从以下帖子中获取了 AutoResizeTextView: Auto Scale TextView Text to Fit within Bounds

但是我不得不修改它,因为这个解决方案在 onLayout 方法中应用了测量的尺寸。但我需要测量时的尺寸,所以我将这个逻辑从 onLayout 移到了 onMeasure。

基本上,我从 LinearLayout 继承了 ButtonView,给了它一个 AutoResizeTextView 子视图,并使用了 Android 测量(onMeasure、onLayout 和布局)。

请记住,我不能使用 Chase 从 LinearLyout 继承整个 View 的解决方案,因为我为 ButtonViews 设置了动画。

测量细节:我在CopyOfGameView的onMeasure中测量了ButtonView,然后在ButtonView的onMeasure中测量了AutoResizeTextView。然后在 ButtonView 的布局方法中,我将 TextView 垂直居中。

于 2013-02-04T14:39:46.427 回答
0

你需要像这样设置布局参数

LayoutParams lp;
lp = (LayoutParams) buttonView.getLayoutParams();
lp.gravity = Gravity.CENTER;
buttonView.setLayoutParams(lp);

于 2012-11-06T08:32:25.323 回答
0

您可以添加更多详细信息吗?我相信你需要指定这个

setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

这样您就可以将其设置为中心...因为我认为android的默认设置是它包装了它的内容

setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 所以你不需要再调整它了......

请添加屏幕截图...以便我们可以帮助您:)

于 2012-09-17T01:59:49.093 回答
0

我建议继承自LinearLayout而不是ViewGroup因为它似乎更容易完成您需要的布局,但我知道这可能不是一个选项,因为您要应用动画。

您的按钮可能发生的情况是布局高度设置为包裹内容,这使得它们在测量时仅与文本一样高。即使您指定了中心重心,这也会使文本看起来与顶部垂直对齐。要解决此问题,您必须计算并设置LayoutParams按钮视图的尺寸(高度和宽度)(调用buttonView.layout()不会这样做)。

作为提示,尝试设置按钮视图的背景颜色,以更好地了解视图的位置和大小。

于 2012-01-11T16:08:00.810 回答