Метод пользовательского представления OnDraw () вызывается только один раз при нажатии кнопки - PullRequest
0 голосов
/ 05 января 2012

Я пытаюсь вызвать метод onDraw при нажатии кнопки, представление кнопки обновляется только один раз, также вызывается метод onDraw. Но без изменений в положении линии.

У меня есть этот пользовательский вид

public LineSeekbar(Context context) {
    super(context);
    this.setWillNotDraw(false);
    setNewX(130);       
}

@Override
protected void onDraw(Canvas canvas) {  
    super.onDraw(canvas);
    Log.e("GRAPH","draw");      
    paint = new Paint(); 
    paint.setARGB(225, 215, 10, 20); 
    paint.setStrokeWidth(2); 
    paint.setStyle(Style.FILL); 
    canvas.drawLine(130,900,getNewX(),100, paint);
    setNewX(getNewX()+15);
}

Вызов этого из класса деятельности

final Bitmap mBackgroundImage = Bitmap.createBitmap(500,500, Bitmap.Config.RGB_565);
    cv =new Canvas(mBackgroundImage);
    LineView = new LineSeekbar(LineActivity.this);
    LineView.setLayoutParams(new LayoutParams(500,500));
    LineView.onMeasure(500,500);
    LineView.invalidate();
    LineView.draw(cv);
    //  LineView = null;
    ImageView mImageView = new ImageView(this);
    mImageView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,    LayoutParams.FILL_PARENT));
    mImageView.setBackgroundColor(android.R.color.white);
    mImageView.setImageBitmap( mBackgroundImage );
    LinearLayout ll =(LinearLayout) findViewById(R.id.linearLayout1);
    ll.addView(mImageView);

    Button inc = (Button) findViewById(R.id.increase);
    inc.setOnClickListener(new OnClickListener() {          
        @Override
        public void onClick(View v) {
            LineView.invalidate();
            LineView.draw(cv);              
        }
    });

Ответы [ 3 ]

1 голос
/ 05 января 2012

Вы должны вызывать экземпляр с маленькой буквой, потому что это не класс: lineView вместо LineView.

Поскольку вы вызываете его из другого потока (UI), вы должны сказать

LineView.postInvalidate ();

Когда вы создаете экземпляр LineView в первый раз, onDraw будет выполнен сам по себе и покажет первую строку.

Не понятно, что такое LineView.draw (cv); Вы можете нарисовать фоновое изображение в onDraw непосредственно перед рисованием линии. Вы можете использовать метод onSizeChange в пользовательском представлении, чтобы найти его реальные размеры и изменить размер своего растрового изображения ...

В onDraw вставьте строку

Log.e ("LineView", Integer.toString (getNewX ()));

и затем в DDMS - LogCat следит за выходом при нажатии кнопки.

0 голосов
/ 06 января 2012

Решил, я поместил пользовательский вид в макет xml, он работает нормально.

0 голосов
/ 05 января 2012

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

Вы не сделали объект класса LineView, как вы должны. Вы должны использовать маленькие буквы для экземпляров.

final Bitmap mBackgroundImage = Bitmap.createBitmap(500,500, Bitmap.Config.RGB_565);
cv =new Canvas(mBackgroundImage);
LineView lineView = new LineSeekbar(LineActivity.this);
lineView.setLayoutParams(new LayoutParams(500,500));
lineView.onMeasure(500,500);
lineView.invalidate();
lineView.draw(cv);
//  LineView = null;
ImageView mImageView = new ImageView(this);
mImageView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,    LayoutParams.FILL_PARENT));
mImageView.setBackgroundColor(android.R.color.white);
mImageView.setImageBitmap( mBackgroundImage );
LinearLayout ll =(LinearLayout) findViewById(R.id.linearLayout1);
ll.addView(mImageView);

Button inc = (Button) findViewById(R.id.increase);
inc.setOnClickListener(new OnClickListener() {          
    @Override
    public void onClick(View v) {
        lineView.invalidate();
        lineView.draw(cv);              
    }
});
...