【问题标题】:OnDraw() method of custom view only called once on button click自定义视图的 OnDraw() 方法仅在按钮单击时调用一次
【发布时间】:2012-01-06 12:29:22
【问题描述】:

我正在尝试在按钮单击时调用 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);              
        }
    });

【问题讨论】:

    标签: android view ondraw


    【解决方案1】:

    你应该用小写字母调用一个实例,因为它不是一个类:lineView insted of LineView。

    既然你是从另一个线程(UI)调用它,你应该说

    LineView.postInvalidate();

    当您第一次创建 LineView 实例时,onDraw 将自行执行并显示第一行。

    不清楚什么是 LineView.draw(cv);您可以在绘制线条之前在 onDraw 中绘制背景图像。您可以在自定义视图中使用 onSizeChange 方法来查找其真实尺寸并调整位图大小...

    在onDraw中插入一行

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

    然后在 DDMS - LogCat 中查看按钮时的输出。

    【讨论】:

    • 我使用了 postInvalidate(),没有变化每次单击按钮时都会调用。
    • 如果你能检测到每次点击按钮都会执行onDraws,那么这取决于代码的绘制位,你确定getNewX()会带来不同的价值并尝试做出更大的改变吗?当您绘制矩形或圆形时,也会使用痛苦样式 FILL,我认为您无法填充线条。应该在构造函数中定义绘制,这样就不会在每次执行 onDraw 时创建
    • 把paint改成Paint paint = new Paint (Paint.ANTI_ALIAS_FLAG);
    • 是的 getNewX() 带来了新的价值。也尝试更改 Paint 对象。 X 位置改变 2 次并绘制一条新线。这可能是与视图大小有关的问题吗? 2 单击按钮后,没有绘制任何内容。
    • 如果没有看到所有代码,我会情不自禁...但是是的,您可能在视图之外绘图。在 onSize 更改中,您可以找到它的实际大小,请参见以下示例:stackoverflow.com/questions/4938822/…
    【解决方案2】:

    试试这个:

    您没有像应有的那样创建 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);              
        }
    });
    

    【讨论】:

    • 是我的错误..我更正了命名。输出仍然没有变化。 View 只更新两次,但每次单击按钮时都会调用 onDraw 方法。
    【解决方案3】:

    解决了,我在xml布局中放置了自定义视图,它工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-03
      • 2015-04-10
      • 1970-01-01
      • 2023-04-02
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多