将动态设置CustomView设置为RelativeLayout中心的难度

时间:2014-09-03 07:41:38

标签: android android-layout android-framelayout

我有CustomView,它只是一个带有一些线条的弧形。

public class CustomDrawableView extends View {
private ShapeDrawable mDrawable;
private Paint paint = new Paint();

public CustomDrawableView(Context context, int startA, int endA) {
    super(context);
     int x = 0;
     int y = 0;
     int width = 400;
     int height = 400;

     paint.setColor(Color.BLACK);

     mDrawable = new ShapeDrawable(new ArcShape(startA, endA));
     mDrawable.getPaint().setColor(0xff74AC23);
     mDrawable.setBounds(x, y, x + width, y + height);
     }

     protected void onDraw(Canvas canvas) {
     mDrawable.draw(canvas);
     canvas.drawLine(0,0,400,0,paint);
     canvas.drawLine(0, 0, 0, 400, paint);
     canvas.drawLine(400,0, 400,400, paint);
    }
}

之后我从xml文件中调出我的线性布局,通过它的id添加一个framelayout。之后,我添加CustomDrawableView并尝试使用重力使其居中。我经历了许多其他问题并尝试了这些解决方案,但它对我来说并不起作用。如果值得注意,我注意到当我使用像textview这样的常规视图时,我的布局中没有自定义视图,它完美地居中。

public class MainActivity extends ActionBarActivity {
private RelativeLayout ll;
private CustomDrawableView testView;  
private RelativeLayout.LayoutParams layout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // load the layout
    LinearLayout linLayout = (LinearLayout)findViewById(R.id.ll);
    linLayout.setOrientation(LinearLayout.VERTICAL);




    /******** Experimental Code **********/
    RelativeLayout rl = new RelativeLayout(this);
    linLayout.addView(rl);

    LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT,   
    LayoutParams.WRAP_CONTENT);

    CustomDrawableView arc = new CustomDrawableView(this,0,30);
    CustomDrawableView arcTwo = new CustomDrawableView(this, 50, 30);
    rl.setGravity(Gravity.CENTER_HORIZONTAL);
    rl.addView(arc, lp);
    rl.addView(arcTwo, lp);

    rl.setBackgroundColor(Color.GRAY); } 

   @Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
    }
}

我使用框架布局,因此我可以互相放置视图。

2 个答案:

答案 0 :(得分:0)

您是否尝试将rl的layout_width和layout_height设置为match_parent?

试试此代码

/******** Experimental Code **********/
RelativeLayout rl = new RelativeLayout(this);
LayoutParams parems = new LayoutParams(LayoutParams.MATH_PARENT,
    LayoutParams.MATH_PARENT);
rl.setParameters(parems);
linLayout.addView(rl);

更新:

请显示您的activity_main.xml代码并注意您的api级别。如果是这样,我将运行您的代码。

否则,您是否尝试从onMeasure()设置布局大小?

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    int heightSize = 0;
    switch (heightMode) {
    case MeasureSpec.AT_MOST: // wrap_confent
        heightSize = 400;
        break;
    case MeasureSpec.EXACTLY: // match_parent
        heightSize = MeasureSpec.getSize(heightMeasureSpec);
        break;
    }

    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int widthSize = 0;
    switch (widthMode) {

    case MeasureSpec.AT_MOST: // wrap_confent
        widthSize = 400;
        break;
    case MeasureSpec.EXACTLY: // match_parent
        widthSize = MeasureSpec.getSize(widthMeasureSpec);
        break;
    }
    setMeasuredDimension(widthSize, heightSize);
}

答案 1 :(得分:0)

这里有一些问题。

首先,您需要为RelativeLayout设置名为" rl"的布局参数。当你将它添加到名为" linLayout的LinearLayout时。"使用以下代码执行此操作:

    RelativeLayout rl = new RelativeLayout(this);
    LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    linLayout.addView(rl, params);

您的另一个问题是,当您将自定义视图添加到rl时,最好将规则添加到布局参数而不是使用重力。下面的代码说明了这一点:

    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    lp.addRule(RelativeLayout.CENTER_IN_PARENT);

    CustomDrawableView arc = new CustomDrawableView(this,0,30);
    CustomDrawableView arcTwo = new CustomDrawableView(this, 50, 30);
    rl.addView(arc, lp);
    rl.addView(arcTwo, lp);

希望这有帮助!