Android API 3: простой пользовательский квадратный компонент

StackOverflow https://stackoverflow.com/questions/9309575

  •  26-10-2019
  •  | 
  •  

Вопрос

Я попытался кодировать пользовательский компонент синего квадрата, чтобы

  • Ширина или высота - родительский размер всякий раз, когда мы говорим, чтобы заполнить родителей, в родительском макете (допустим, res/mayout/main.xml)
  • Ширина или высота составляет 30 px (или на 30 DPI лучше?) Когда мы говорим, чтобы обернуть контент в родительскую макет.

На данный момент, благодаря rajesh.edi, мне удалось покрасить синий квадрат: но размер составляет 30 % * 30PX в обоих случаях (заполните содержимое родителя или обертывания). Итак, есть ли способ обнаружить режим «содержимое обертывания» и режим «заполнить родитель», чтобы я мог адаптировать размер?

Вот моя попытка для компонента (я назвал его BoardView, потому что этот синий квадрат является предварительным шагом перед созданием компонента шахматной платы):

package com.gmail.bernabe.laurent.android.simple_chess_board.views;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.View;

public class BoardView extends View {


    public BoardView(Context context) {
        super(context);
        setBackgroundColor(Color.BLUE);
    }



    public BoardView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }



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

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);

        int newWidth, newHeight;

        if (widthSpecMode == MeasureSpec.EXACTLY)
            newWidth = 30;
        else
            newWidth = MeasureSpec.getSize(widthMeasureSpec);

        if (heightSpecMode == MeasureSpec.EXACTLY)
            newHeight = 30;
        else
            newHeight = MeasureSpec.getSize(heightMeasureSpec);

        setMeasuredDimension(newWidth, newHeight);
    }

    @Override
protected void onDraw(Canvas canvas) {
    Rect rect = new Rect(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.BLUE); 
        canvas.drawRect(rect, paint);
    }


}

и вот мой main.xml

<com.gmail.bernabe.laurent.android.simple_chess_board.views.BoardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/boardView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
/>

Я был уверен, что ошибка не произошла из -за того, что я не переопределял View.ondraw (): но я был неправ. Почему ? Почему настройка цвета фона на синий недостаточно?

Заранее спасибо, если кто -то может мне помочь.

Это было полезно?

Решение

Наконец, я управлял всякий раз, когда пользователь устанавливал в RAW_CONTENT, я получаю AT_OST AS MODE.

 package com.gmail.bernabe.laurent.android.simple_chess_board.views;

 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Color;
 import android.graphics.Paint;
 import android.graphics.Rect;
 import android.util.AttributeSet;
 import android.view.View;

 public class BoardView extends View {


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



    public BoardView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }     



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



    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);

        int widthMeasure = MeasureSpec.getSize(widthMeasureSpec);
        int heightMeasure = MeasureSpec.getSize(heightMeasureSpec);

        int newWidth, newHeight;

        if (widthSpecMode == MeasureSpec.AT_MOST)
            newWidth = 30;
        else
            newWidth = widthMeasure;

        if (heightSpecMode == MeasureSpec.AT_MOST)
            newHeight = 30;
        else
            newHeight = heightMeasure;

        setMeasuredDimension(newWidth, newHeight);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        Rect rect = new Rect(0, 0, getWidth(), getHeight());
        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        canvas.drawRect(rect, paint);
    }



 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top