2014-09-03 3 views
0

У меня есть CustomView, который представляет собой только форму дуги с некоторыми строками.Сложность настройки динамической настройки CustomView в центр RelativeLayout

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-файла через свой идентификатор, добавляя к нему рамку. После этого я добавляю 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); 
    } 
} 

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

ответ

0

Вы пытаетесь установить layout_width и layout_height rl в 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); 

UPDATE:

Пожалуйста, покажите код 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); 
} 
+0

Я пробовал это, и он все еще не работает. – user3288005

0

Здесь есть несколько проблем.

Прежде всего, вам нужно установить параметры компоновки для RelativeLayout под названием «rl», когда вы добавите его в LinearLayout под названием «linLayout». Сделайте это с помощью следующего кода:

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

Ваш другой вопрос в том, что когда вы добавляете ваши customViews к Р.Л., лучше добавить правило к Params макета, чем использовать гравитацию. Нижеприведенный код демонстрирует следующее:

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

Надеюсь, это поможет!

+0

Я тоже попробовал, и он все еще не работает. Я пытаюсь понять, почему. Есть ли что-то, что я должен переопределить, если я использую customview. – user3288005

Смежные вопросы