Android: как реализовать отрисовку холста в существующем представлении в XML

У меня есть файл XML в моей программе, например:

 <LinearLayout android:orientation="horizontal"
                  android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_weight="1">
            <LinearLayout android:layout_width="fill_parent"
                       android:layout_height="fill_parent"
                       android:layout_weight="1"
                       android:background="#ef3"
                       android:id="@+id/img01"/>
            <LinearLayout android:layout_width="fill_parent"
                       android:layout_height="fill_parent"
                       android:layout_weight="1"
                       android:background="#E8A2B4"
                       android:id="@+id/img02"/>
    </LinearLayout>

Кроме того, у меня есть функция рисования холста в моей деятельности.

public class ImgTestActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    private class iniView extends View {

        public iniView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }

        @Override
        protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);
            //set background color
            canvas.drawColor(Color.WHITE);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setColor(Color.RED);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(3);
            canvas.drawCircle(this.getWidth()/2, this.getHeight()/2, 30, paint);
        }

    }
}

Я прочитал некоторые статьи из Интернета. Некоторые люди создают собственное представление в действии и устанавливают в него краску.

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyView myView=new MyView(this);
        setContentView(myView);
    }

Но я хочу установить свою краску в эти два LinearLayout.

<LinearLayout android:layout_width="fill_parent"
                       android:layout_height="fill_parent"
                       android:layout_weight="1"
                       android:background="#ef3"
                       android:id="@+id/img01"/>
            <LinearLayout android:layout_width="fill_parent"
                       android:layout_height="fill_parent"
                       android:layout_weight="1"
                       android:background="#E8A2B4"
                       android:id="@+id/img02"/>

Как я могу это сделать? (Я хочу нарисовать два одинаковых круга в центре этого двух линейного макета)


person SPG    schedule 22.11.2011    source источник
comment
Будет ли проблематично использовать изображения png для ваших кругов? (Если это так, у меня может быть решение;))   -  person Renaud    schedule 23.11.2011


Ответы (3)


Одним из решений было бы извлечь initView (кстати, это должен быть CamelCase), а затем ввести его в xml с полным путем к классу представления в качестве имени тега. Давайте посмотрим пример. Результирующий класс должен выглядеть так:

package your.package;

// imports

private class CircleView extends View {

    public iniView(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // your painting stuff
    }

}

И xml должен быть примерно таким:

<your.package.CircleView 
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:layout_weight="1"
     android:background="#ef3"
     android:id="@+id/img01"/>
<your.package.CircleView 
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:layout_weight="1"
     android:background="#E8A2B4"
     android:id="@+id/img02"/>

Хотя вы можете взглянуть на доступные ресурсы Drawable в Android: http://developer.android.com/guide/topics/resources/drawable-resource.html

Существует тип Shape Drawable, который может позволить вам делайте то, что хотите, более простым способом и отделенным от бизнес-логики Activity.

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

person pablisco    schedule 22.11.2011
comment
Я устал от этого, но есть две проблемы. Во-первых, в вашем результирующем классе должны ли iniview и CirlceView иметь одно и то же имя? (Потому что в Eclipse есть ошибка), во-вторых, я заменил свой XML-файл, но когда я запускаю программу - РАЗБИТ! - person SPG; 22.11.2011
comment
Что ж, в примере я переименовал innerView в CicleView, так что да, у них одинаковые имена. И XML должен быть внутри вашего исходного корня LinearLayout. Также вы должны заменить информацию о пакете (где указано your.package на пакет для вашего приложения). Кроме того, можете ли вы опубликовать ошибки, которые дает вам eclipse? - person pablisco; 22.11.2011
comment
@nich Пожалуйста, отредактируйте вопрос вместо редактирования ответа, чтобы предоставить дополнительную информацию. - person Paŭlo Ebermann; 22.11.2011

Вы можете отобразить свое xml-представление, используя это:

View viewalias = (View) this.findViewById(R.layout.yourxml);, а затем рисуйте на нем, как хотите, для получения дополнительной информации см. это.

person Alaa Eldin    schedule 14.06.2012

попробуй это :

...
import android.util.AttributeSet;
...
public iniView(Context context, AttributeSet attributeSet) {
    super(context, attributeSet);
}
...
person Qhan    schedule 25.04.2016