如何在特定位置放置视图(x,y坐标)

时间:2011-08-23 23:34:45

标签: android view runtime coordinates relativelayout

我将查看(我的类扩展View)放在特定位置时遇到问题。 我设计了一款将屏幕视为网格网的游戏。我从特定视图的用户x和y坐标得到(我有不同类型的视图)。

我的第一个任务是在其位置设置正确的视图。我该怎么做? 我正在使用RelativeLayout作为屏幕。

P.S。我不想使用AbsoluteLayout参数,因为它被截断了。

2 个答案:

答案 0 :(得分:1)

这不是实现它的最佳方式,但它是一种解决方案......

创建一个扩展您的父ViewGroup的类,比如RelativeLayout或其他ViewGroup。 在覆盖onFinishInflate()时找到您自己的观点。

在调用onLayout()后覆盖super.onLayout()方法并手动布局自己的视图。

最后,每次要刷新自己视图的位置时,只需致电requestLayout()

以下是一个示例:

private AwesomeView mMyView;
private int mYourDesiredX;
private int mYourDesiredY;

@Override
public void onFinishInflate() {
    super.onFinishInflate();
    if (mMyView == null) {
        mMyView = (AwesomeView)findViewById();
    }
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);
    mMyView.layout(mYourDesiredX,
            mYourDesiredY,
            mYourDesiredX + mMyView.getWidth(),
            mYourDesiredY + mMyView.getHeight());
}

但这不是一个有效的解决方案。

如果您正在制作游戏,请尝试SurfaceView甚至GLSurfaceView并使用Canvas自己绘制对象。

答案 1 :(得分:0)

假设你想在屏幕上放置一个按钮,你的网格中有 100x60个单元格。也就是说,通过考虑沿水平和垂直方向的像素数,您已将屏幕划分为100x60个单元格。在横向模式下,宽度像素的数量将更多,因此考虑将其除以100,并且高度像素的数量将更少,因此除以60.因此,考虑到使用具有分辨率800x480像素<的TAB的人/ strong>,在横向模式下 - 沿水平方向每像素8像素(800/100),沿垂直方向每像素8像素(480/60)。在纵向模式下,因素将反之亦然。

现在你要放置一个宽度为 35个单元格的按钮,高度为wrap_content,根据其上的文字并将其放在坐标 20,20(x,y)上细胞数。我已经提供了一种方法来实现这一目标。注意:无论你以这种方式放置或者使用这个想法,它都会在同一个地方,并且在多个显示分辨率上具有相同的尺寸和外观。[这里 pixels_grid_X =沿水平方向的每个单元格的像素数(800/100)] [类似 pixels_grid_Y =垂直每个单元格的像素数(480/60)]

放置按钮的方法

public void placeButton(int btnId, int xCordinate, int yCordinate, int btnWidth,
        float fontSize, String btnTextColor, String btnBackgroundColor, String message){



    try{


        int currentApi = Build.VERSION.SDK_INT;
        /** Creating a new Button and setting its properties */
       /**pass context as a parameter for the constructor of the class if ur creating a new class just for placing views on screen,else it can be getBaseContext().*/
        Button btn = new Button(context);
        /**Use to access this view using Id to add any kind of listeners on this view.*/
        btn.setId(btnId);

        btn.setText(message);
        /**Let the text size be in pixels*/
        btn.setTextSize(TypedValue.COMPLEX_UNIT_PX, pixels_grid_X*fontSize);

        if(btnTextColor != null)

        {
            btn.setTextColor(Color.parseColor(btnTextColor));

        }

        int widthInPixel = (int) (btnWidth*pixels_grid_X);
        btn.setWidth(widthInPixel);


        if(btnBackgroundColor != null)
        {

            if(currentApi >= 16){
                btn.setBackground(new ColorDrawable(Color.parseColor(btnBackgroundColor )));
            }
            else
            {
                btn.setBackgroundDrawable(new ColorDrawable(Color.parseColor(btnBackgroundColor )));
            }
            /**Registering for a onTouch listener to provide clicked effect just like a button.
             * To provide a click effect for the custom button*/
            btn.setOnTouchListener(this);
        }
        else
        {   /**If btnBackgroundColor was equal to null, set default properties to that button.*/ 
            btn.setBackgroundResource(android.R.drawable.btn_default);
        }

        /** Providing layout params for the image view.*/
        RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
        params1.leftMargin = (int) (xCordinate*pixels_grid_X);
        params1.topMargin = (int) (yCordinate*pixels_grid_Y);
        btn.setLayoutParams(params1);

        /**
         * The parent layout in which the button is to be displayed.
         * Finally adding the button to the parent layout.
         * layout is the reference to ur relative layout.   
         */

        layout.addView(btn,params1);


    }catch(Exception ex){
        ex.printStackTrace();

    }

}