рисование - canvas android




Android: рисование холста в ImageView (4)

Я новичок в программировании на Android, и я пытаюсь понять это;

В моем макете у меня есть TextView, ImageView и Button, все на вертикально ориентированном LinearLayout.

Я хочу иметь возможность динамически рисовать круги в ImageView, не нарушая остальную часть моего макета (textview / button). Я пытаюсь создать холст и использовать функцию drawcircle внутри canvas, чтобы установить местоположение круга. И затем каким-то образом нарисуйте этот холст на мое изображение. Я не могу заставить это работать, есть ли уловка? Или мой метод принципиально неправильный? Как я могу рисовать круги в ImageView без повторного создания всего моего макета?

Благодаря!


Если у вас есть xml с макетом, все элементы расположены в вертикальной ориентации.

Вы можете добиться того, чего хотите, создав класс в своем пакете, который расширяет класс и отменяет его метод onDraw. нарисуйте круг в нем, как хотите.

то вместо добавления imageView в макете добавьте это собственное представление в макет xml.

<LinearLayout>

 < TextView> < /TextView>

  < Button> < /Button>

  <com.prac.MyView> </ com.prac.MyView>

</ LinearLayout>

Проверьте следующую ссылку для 2D-графики. Это отличный учебник для чтения.

Надеюсь эта помощь:)


Есть несколько способов сделать то, что вы хотите, но использование ImageView так, как вы описываете, не является одним из них. Одна из возможностей заключается в том, чтобы изображение ImageView отображало анимированный Drawable. Затем вы можете сосредоточиться на том, чтобы ваша Drawable-реализация рисовала круги. Другой - создать новый битмап каждый раз, когда вы хотите, чтобы изображение изменилось, и установите ImageView для отображения нового растрового изображения. Обычным способом сделать это, однако, является создание пользовательского подкласса View. В образце проекта API Demos есть пример пользовательского представления, и вы можете найти множество руководств с Google.


Я думаю, что лучшим подходом было бы создание пользовательского ImageView и переопределить метод onDraw. Что-то вроде:

public class CustomView extends ImageView {

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

public CustomView(Context context, AttributeSet attrst) {
    super(context, attrst);
}

public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

MyBitmapFactory bitMapFac = null;
public void setBitmapFactory(MyBitmapFactory bitMapFac)
{
    this.bitMapFac = bitMapFac;
}

@Override
public void onDraw(Canvas canvas) {

    canvas.drawColor(Color.TRANSPARENT);
    /*instantiate a bitmap and draw stuff here, it could well be another
    class which you systematically update via a different thread so that you can get a fresh updated
    bitmap from, that you desire to be updated onto the custom ImageView. 
   That will happen everytime onDraw has received a call i.e. something like:*/
    Bitmap myBitmap = bitMapFac.update(); //where update returns the most up  to date Bitmap
    //here you set the rectangles in which you want to draw the bitmap and pass the bitmap        
    canvas.drawBitmap(myBitMap, new Rect(0,0,400,400), new Rect(0,0,240,135) , null);
    super.onDraw(canvas);
    //you need to call postInvalidate so that the system knows that it  should redraw your custom ImageView
    this.postInvalidate();
}
}

Было бы неплохо реализовать некоторую логику, которая проверяет, есть ли новый битмап для приобретения через метод update (), поэтому код внутри onDraw не будет выполняться каждый раз и накладывать служебные данные в систему.

И затем используйте свой собственный просмотр везде, где он вам нужен. Самый простой способ - объявить его непосредственно в файле activity_layout.xml следующим образом:

   <com.mycustomviews.CustomView
        android:id="@+id/customView"
        android:layout_centerInParent="true"
        android:layout_height="135dp"
        android:layout_width="240dp"
       android:background="@android:color/transparent"/>

И тогда доступ находится в вашем коде, как и любое другое представление, используя:

   customView = (CustomView) findViewById(R.id.customView);

     ImageView imageView=(ImageView) findViewById(R.id.image);
        Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);    
        Canvas canvas = new Canvas(bitmap);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(Color.BLACK);
        canvas.drawCircle(50, 50, 10, paint);
        imageView.setImageBitmap(bitmap);




draw