Линия рисования холста невидима

#android #canvas

#Android #холст

Вопрос:

Я пытаюсь нарисовать одну строку в Android с помощью canvas

Мой класс :

 public class LineDrawer extends View {

    public LineDrawer(Context context) {
        super(context);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setStrokeWidth(10);

        float left = 20;
        float top = 20;
        float right = 50;
        float bottom = 100;

        canvas.drawLine(left, top, right, bottom, paint);

    }
}
  

Моя основная деятельность :

 public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       LineDrawer lineDrawer = new  LineDrawer(this);

        setContentView(R.layout.activity_Main);
    }
}
  

Я не могу найти, в чем проблема, я пробую все решения в Интернете, но ничего не происходит, все еще пустое действие..

Должен ли я импортировать некоторый код?

Комментарии:

1. setContentView(lineDrawer)

2. что, если я хочу использовать XML-файл для этого действия?

3. поэтому используйте setContentView(R.layout.activity_Main)

Ответ №1:

lineDrawer создается, но нигде не добавляется. Недостаточно просто создать представление, вам нужно добавить его к текущим отображаемым представлениям, которые будут учтены и нарисованы. У вас есть два варианта:

  • Добавьте ее в свой XML-макет. Вам нужно будет добавить следующий конструктор в свой пользовательский вид.

    public LineDrawer(Context context, AttributeSet attrs) {
    super(context, attrs);
    }

  • Используйте addView(). В любом случае, учитывая, насколько прост ваш пример, я буду использовать первый (общий) метод.

В качестве дополнительного комментария Paint paint объект должен быть создан при инициализации представления, поскольку это дорогостоящая операция. Дополнительную информацию об этом см. В оригинальной документации.

Комментарии:

1. когда экземпляр создается из наследования класса от представления, когда компилятор пытается нарисовать представление, он переходит к методу onDraw() , не так ли?

2. Недостаточно просто создать класс, вам нужно добавить его в текущие отображаемые представления, которые будут учтены и отрисованы. Кроме того, просто для корректности, компилятор ничего не рисует, это ОС. Я отредактировал ответ.

3. спасибо, но не могли бы вы сказать мне, как добавить эту строку в мое представление? addContentView принимает два параметра context и LayoutParms

4. Как я уже сказал, самый простой способ — это использовать непосредственно в вашем макете activity_Main. Вы должны найти ее в res / layout / activity_Main в структуре вашего проекта. Откройте его, скопируйте и вставьте XML-файл в свой вопрос. Вы должны поместить тег, похожий на <your.package.LineDrawer android:layout_width="wrap_content" android:layout_height="wrap_content" /> (обратите внимание, что тег закрывается символом / в конце).