Android使onDraw无效

时间:2014-03-27 14:08:39

标签: java android ondraw

我刚刚开始学习android,我在网上搜索了如何强制进行onDraw更新,我发现的唯一方法是无效。它工作了一段时间,但之后它再也没有更新了。

这是我的代码:

package com.andrewxd.test01;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class Game extends View {

    private Bitmap enemy;
    private Paint dpaint;
    private float x,y;

    public Game(Context context) {
        super(context);
        enemy = BitmapFactory.decodeResource(getResources(), R.drawable.enemy);
        enemy = Bitmap.createScaledBitmap(enemy, 300 , 300, false);
        dpaint = new Paint();
        x = 0;
        y = 0;
    }

    @Override
    protected void onDraw(Canvas canvas){
        canvas.drawBitmap(enemy, x, y, dpaint);
        Log.d("GAME", "REDRAWN");
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        x = event.getX();
        y = event.getY();
        invalidate();
        return true;
    }
}

在x和y更改后,有人可以建议我更好的重绘方法吗?

3 个答案:

答案 0 :(得分:2)

来自API-Docs

  

视图的基本周期如下:

     
      
  • 事件进入并被分派到适当的视图。视图处理事件并通知任何侦听器。
  •   
  • 如果在处理事件的过程中,可能需要更改视图的边界,视图将调用requestLayout()。
  •   
  • 同样,如果在处理事件的过程中,可能需要更改视图的外观,视图将调用invalidate()
  •   
  • 如果调用了requestLayout()或invalidate(),框架将根据需要负责测量,布局和绘制树。
  •   

所以,这可能就是这样做的方式!

答案 1 :(得分:0)

一切看起来都不错,我试用了你的示例代码,并确保更新。与我的代码和你的代码的唯一区别是我将这样的构造函数覆盖并将视图放到布局中:

public class Game extends View {

private Bitmap enemy;
private Paint dpaint;
private float x, y;

public Game(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    enemy = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
    enemy = Bitmap.createScaledBitmap(enemy, 300, 300, false);
    dpaint = new Paint();
    x = 0;
    y = 0;
}

public Game(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
    // TODO Auto-generated constructor stub
}

public Game(Context context) {
    this(context, null);

}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawBitmap(enemy, x, y, dpaint);
    Log.d("GAME", "REDRAWN");
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    x = event.getX();
    y = event.getY();
    invalidate();
    return true;
}

}

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<com.example.gametest.Game
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</RelativeLayout>

答案 2 :(得分:0)

遇到同样的问题。使用四个参数调用 invalidate 对我有用:

invalidate(0,0,getWidth(),getHeight());

看起来像Android中的一些错误。