Android RelativeLayout My Own MousePadView - PullRequest
0 голосов
/ 25 декабря 2011

Пожалуйста, помогите мне исправить код ниже.Я делаю вид коврика для мыши для моего приложения Android Remote.

public class MousePadView extends RelativeLayout {

    private float scale;

    // MOUSE BUTTONS LEFT CLICK, MIDDLE CLICK, RIGHT CLICK

    private LinearLayout layoutMouseButtonBody;
    private RelativeLayout.LayoutParams paramsMouseButtonBody;

    private Button left;
    private Button middle;
    private Button right;
    private LinearLayout.LayoutParams paramsButtons;

    // BUTTONS FOR MOUSEWHEEL (UP AND DOWN)

    private LinearLayout layoutWheelsBody;
    private RelativeLayout.LayoutParams paramsWheelBody;
    private Button up;
    private Button down;
    private LinearLayout.LayoutParams paramsWheelButton;

    public MousePadView2(Context context, AttributeSet attrs, int defStyle) { // CONSTRUCTOR
        super(context, attrs, defStyle);
        scale = context.getResources().getDisplayMetrics().density; // GET SCALE FOR CONVERTING DPI TO PIXELS

        // MOUSE BUTTON LAYOUT

        paramsButtons = new LinearLayout.LayoutParams(DpiToPixels(0), LayoutParams.WRAP_CONTENT, 1);
        left = new Button(context);
        left.setText("L");
        left.setLayoutParams(paramsButtons);
        middle = new Button(context);
        middle.setText("M");
        middle.setLayoutParams(paramsButtons);
        right = new Button(context);
        right.setText("R");
        right.setLayoutParams(paramsButtons);

        paramsMouseButtonBody = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        paramsMouseButtonBody.addRule(ALIGN_PARENT_BOTTOM); // RELATIVE LAYOUT RULES
        paramsMouseButtonBody.addRule(ALIGN_PARENT_LEFT); // RELATIVE LAYOUT RULES
        paramsMouseButtonBody.addRule(ALIGN_PARENT_RIGHT); // RELATIVE LAYOUT RULES
        layoutMouseButtonBody = new LinearLayout(context);
        layoutMouseButtonBody.setBackgroundResource(android.R.drawable.bottom_bar);
//      layoutMouseButtonBody.setPadding(0, DpiToPixels(4), 0, 0);
        layoutMouseButtonBody.setOrientation(LinearLayout.HORIZONTAL);
        layoutMouseButtonBody.setLayoutParams(paramsMouseButtonBody);
        layoutMouseButtonBody.addView(left);
        layoutMouseButtonBody.addView(middle);
        layoutMouseButtonBody.addView(right);

        // WHEELS

        paramsWheelButton = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        up = new Button(context);
        up.setText("U");
        up.setLayoutParams(paramsWheelButton);
        down = new Button(context);
        down.setText("D");
        down.setLayoutParams(paramsWheelButton);

        paramsWheelBody = new RelativeLayout.LayoutParams(DpiToPixels(32), LayoutParams.WRAP_CONTENT);
        paramsWheelBody.addRule(LEFT_OF, layoutMouseButtonBody.getId());
        paramsWheelBody.addRule(ALIGN_PARENT_BOTTOM);
        layoutWheelsBody = new LinearLayout(context);
        layoutWheelsBody.setOrientation(LinearLayout.VERTICAL);
        layoutWheelsBody.setBackgroundResource(android.R.drawable.bottom_bar);
        layoutWheelsBody.setLayoutParams(paramsWheelBody);
        layoutWheelsBody.addView(up);
        layoutWheelsBody.addView(down);

        // PARENT
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        addView(layoutMouseButtonBody); // add mousebutton layout in parent (relativelayout)
        addView(layoutWheelsBody); // add mousewheel button layout in parent (relativelayout)
    }


    private int DpiToPixels(int dp) {
        return (int)(dp * scale + 0.5f); // converting DPI to Pixels
    }

}

The output generated by Android SDK This is the output that I want

Изображение слева - это вывод, сгенерированный Android SDK, а справа -вывод, который я хочу.

Пожалуйста, помогите мне.

Я не хочу раздувать макет из XML.

Ответы [ 2 ]

0 голосов
/ 25 декабря 2011

Я думаю, что единственный способ добиться того, что вы ищете, - это сгруппировать раскладку колеса и кнопки в другую раскладку. После этого просто выровняйте результат по нижней части родительского элемента.

Добавьте что-то вроде этого:

LayoutParams paramsTotal = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
paramsTotal.addRule(ALIGN_PARENT_BOTTOM);
LinearLayout layoutTotal = new LinearLayout(context);
layoutTotal.setOrientation(LinearLayout.VERTICAL);
layoutTotal.setLayoutParams(paramsTotal);
layoutTotal.addView(layoutWheelsBody);
layoutTotal.addView(layoutMouseButtonBody);

// PARENT
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
addView(layoutTotal); // add the combined layout

Это должно поместить кнопки колесика прямо над кнопками мыши (или наоборот: кнопки мыши прямо под кнопками колесика), а комбинация должна быть полностью внизу.

// Редактировать: альтернативно, вы можете сделать корневой макет LinearLayout и добавить фиктивный вид с весом «1» вверху, который будет толкать другие элементы вниз. Я, вероятно, предпочел бы вариант RelativeLayout, хотя.

Просто из любопытства: почему бы просто не надуть макет? Лично я нахожу этот способ более управляемым.

0 голосов
/ 25 декабря 2011

Ваше управление макетом испорчено.Я предлагаю использовать этот код:

        // MOUSE BUTTON LAYOUT

        paramsButtons = new LinearLayout.LayoutParams(DpiToPixels(0), LayoutParams.WRAP_CONTENT, 1);
        left = new Button(context);
        left.setText("L");
        middle = new Button(context);
        middle.setText("M");
        right = new Button(context);
        right.setText("R");

        paramsMouseButtonBody = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
        paramsMouseButtonBody.addRule(ALIGN_PARENT_BOTTOM); // RELATIVE LAYOUT RULES

        layoutMouseButtonBody = new LinearLayout(context);
        layoutMouseButtonBody.setBackgroundResource(android.R.drawable.bottom_bar);
//      layoutMouseButtonBody.setPadding(0, DpiToPixels(4), 0, 0);
        layoutMouseButtonBody.setOrientation(LinearLayout.HORIZONTAL);
        layoutMouseButtonBody.addView(left, paramsButtons );
        layoutMouseButtonBody.addView(middle, paramsButtons );
        layoutMouseButtonBody.addView(right, paramsButtons );

        // WHEELS

        paramsWheelButton = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        up = new Button(context);
        up.setText("U");
        down = new Button(context);
        down.setText("D");

        paramsWheelBody = new RelativeLayout.LayoutParams(DpiToPixels(32), LayoutParams.WRAP_CONTENT);
        paramsWheelBody.addRule(ABOVE, layoutMouseButtonBody.getId());

        layoutWheelsBody = new LinearLayout(context);
        layoutWheelsBody.setOrientation(LinearLayout.VERTICAL);
        layoutWheelsBody.setBackgroundResource(android.R.drawable.bottom_bar);
        layoutWheelsBody.addView(up, paramsWheelButton);
        layoutWheelsBody.addView(down, paramsWheelButton);

        // PARENT
        setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        addView(layoutMouseButtonBody, paramsMouseButtonBody ); // add mousebutton layout in parent (relativelayout)
        addView(layoutWheelsBody, paramsWheelBody); // add mousewheel button layout in parent (relativelayout)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...