Android RelativeLayout我自己的MousePadView

时间:2011-12-25 02:54:28

标签: android android-layout

请帮我修改下面的代码。 我正在为我的Android远程应用程序制作鼠标垫。

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 :(得分:0)

您的布局管理混乱了。我建议使用这段代码:

        // 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)

答案 1 :(得分:0)

我认为实现您所需要的唯一方法是将您的滚轮和按钮布局分组到另一个布局中。之后,只需将结果与父级的底部对齐即可。

添加如下内容:

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选项。

出于好奇:为什么不夸大布局呢?就个人而言,我发现这种方式更容易管理。