Как отключить недействительность()?

Сначала моя программа выглядит так:

введите здесь описание изображения

Но когда я перемещаю изображение по экрану, программа превращается в:

введите здесь описание изображения

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

вот мой код: Пользовательский вид: package com.graph.base;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
import java.util.Random;

public class CustomView extends View
{
Random random=new Random();
public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

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

public CustomView(Context context) {
    super(context);
}
public void onDraw (Canvas canvas)
{
    super.onDraw(canvas);
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.WHITE);
    canvas.drawPaint(paint);
    Path path=new Path();
    path.moveTo(10, 10);
    for (float i=0.5f; i<=140; i+=10)
    {
        path.quadTo(10+i*5, 10+random.nextInt(500), 10+(i+10)*5,     10+random.nextInt(500));
    }
    paint.setDither(true);
    paint.setColor(Color.RED);
    paint.setStyle(Paint.Style.STROKE);    
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStrokeWidth(2);
    canvas.drawPath(path, paint);
}

}

Основное действие

package com.graph.base;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;

public class MainActivity extends Activity {
FrameLayout frame;
ImageView image;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    frame=(FrameLayout)findViewById(R.id.frameLayout1);
    image=(ImageView)findViewById(R.id.imageView1);
    image.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            Log.e("TAG", "Touch happend");
            switch (event.getAction())
            {
            case MotionEvent.ACTION_MOVE:
            {
                image.setPadding((int)event.getX(),     (int)event.getY(), 0, 0);
                break;
            }

            }

            return true;
        }
    });
}

public void invalidateButton_Click (View v)
{
    frame.invalidate();
}
}

person m9_psy    schedule 19.02.2012    source источник


Ответы (2)


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

// Outside of onDraw()
Bitmap bmDest = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
Canvas mycanvas = new Canvas(bmDest);
// Do your drawing on the canvas outside of the onDraw() method

В onDraw() вы просто сделаете это:

canvas.drawBitmap(bmDest, x, y, null);
person BitBank    schedule 19.02.2012
comment
не могу опубликовать код здесь, но у меня возникла ошибка при попытке переписать весь мой метод onDraw в конструктор моего customView. Я думаю, что когда я создаю свое представление, я генерирую график, помещаю его на растровый холст и затем рисую, но у меня много ошибок. - person m9_psy; 20.02.2012
comment
Быстрый просмотр вашего кода выглядит нормально, за исключением функции drawBitmap(). 2 числа - это верхний левый угол x/y, а не ширина/высота. Вы не показали мне, что это за ошибки, поэтому я не могу комментировать. Вам действительно нужно правильно спроектировать логику рисования/рисования, чтобы работать так, как вы хотите. - person BitBank; 20.02.2012
comment
Я не могу понять, как это работает. Не могу понять разницу между использованием только холста и холста + растрового изображения. Не могу понять, как использовать растровое изображение в целом. Я написал код, в нем нет ошибок, но он не работает. код - person m9_psy; 20.02.2012
comment
Может быть, я напишу свои мысли? Холст — это лист бумаги, битмап — это кожа, которую мы делаем все то же самое на бумаге, но потом можем положить в банк и использовать где угодно? Мы помещаем кожу на бумагу с помощью конструктора canvas=new Canvas(bitmap), затем мы рисуем на бумаге, как canvas.drawPath, но наше растровое изображение в этот момент тоже рисует? А у нас такой же холст, но другого формата? Не знаю, как это объяснить, потому что мой английский плохой. - person m9_psy; 20.02.2012
comment
Графический интерфейс Android, как и многие графические системы, имеет понятие аннулирования отображения, когда что-то нужно изменить. Если ваш текущий вид имеет возможность прокрутки, прокрутка дисплея сделает его недействительным и вызовет метод onDraw(). Затем ваш код отвечает за перерисовку дисплея. Если вы рисуете случайным образом при каждом вызове onDraw(), он будет выглядеть неорганизованным при прокрутке представления. Вам нужно сохранить свою графическую информацию в той или иной форме, а растровое изображение — хороший способ сохранить ваш рисунок. Растровое изображение можно рисовать в любое время, а затем перекрашивать в новой позиции. - person BitBank; 20.02.2012
comment
Да, я понимаю, что onDraw() вызывается, когда я что-то делаю, но я не могу понять, как я могу сохранить свои данные с экрана. Логика не проблема, она проста и понятна, код - проблема. - person m9_psy; 20.02.2012
comment
Похоже, что логика по-прежнему остается проблемой. Ваша аналогия с бумагой сбивает с толку. Это действительно очень просто. Растровый объект может хранить изображение в памяти. Он сохранит ваши инструкции по рисованию. Текущий вид может попросить быть окрашенным в любое время. Вы просто рисуете свое растровое изображение на этом холсте, когда об этом просит onDraw(). - person BitBank; 20.02.2012
comment
Найди это! Ошибка canvas.drawBitmap(bitmap, view.getWidth(), view.getHeight(), null); Но мне нужно: canvas.drawBitmap(bitmap, 0, 0, null); Так что, спасибо, ты спас меня от бессонных ночей. - person m9_psy; 20.02.2012

На самом деле, вы не должны "отключать аннулирование", а действительно вызывать "аннулирование"...

In

case MotionEvent.ACTION_MOVE:
        {
            image.setPadding((int)event.getX(),     (int)event.getY(), 0, 0);
            // here call frame.invalidate(Rect dirty), with dirty set to where the image was previously
            break;
        }

Обратите внимание, что если ваш пользовательский вид рисует «Случайно», вы можете получить растровое изображение с кешированной версией и рисовать из него (блит-копия)

person Matthieu    schedule 19.02.2012