android旧版与较新版本

时间:2014-02-09 12:27:05

标签: android variables canvas draw

我对我的代码在android 3和android 4中的工作方式感到有点困惑。我试图每2秒拍一张照片,每次都找到它的Hue和Lum然后将这些数字用作X和Y coords in a canvasView在地图上绘制十字。我使用的可怕方式在android 3中运行良好。以下是我的代码块。

   //this is the Activity to take the picture
    public class ProcessAnalyser extends Activity implements OnClickListener,
    SurfaceHolder.Callback, Camera.PictureCallback {

    ... declare a bunch of variables here
    static double H, L;

    public void onPictureTaken(final byte[] data, Camera camera) {
    ...code here
    H = some value;
    L = some value;
    }

经过长时间的RGB工作后,H和L得到一些我从下一个课程中访问的值

  // this View draws the cross on a canvas
  public class CanvasView extends View  {
  Bitmap bmp;
  float X, Y;
  static double  kx, ky,width, height;// the code could be wrote whothout all these vars, but I try to split the drawing line of code into smaller chunks

public CanvasView(Context context, AttributeSet attrs) {
    super(context, attrs);
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if(inflater != null){       
        inflater.getContext();//this was the BIG problem
    }

    bmp=BitmapFactory.decodeResource(getResources(), R.drawable.position);     
}

@Override
protected void onDraw(Canvas canvas ) {

    super.onDraw(canvas);

    width = (double) getWidth();
    height = (double) getHeight();
    kx = (double)width/360;
    ky = (double)height/100;
    X = Math.round(ProcessAnalyser.H);
    Y = Math.round(ProcessAnalyser.L);


    setBackgroundResource(R.drawable.spectrum); 

    canvas.drawBitmap(bmp, (float)(X *kx)-15, (float) (Y *ky)-15 , null);       

}

}

我猜这种做法对某些人来说看起来很糟糕,但它确实有效。每次在带有android 3的三星平板电脑上拍摄新照片时,十字架都会在一个新的地方重新粉刷。但是,如果我在装有android 4的设备上试用它,则十字架会保持在0,0位置。

1 个答案:

答案 0 :(得分:0)

我自己排序,所以这就是答案。问题是canvas类中的代码正在完成它的工作,但只有一次。

X = Math.round(ProcessAnalyser.H);
Y = Math.round(ProcessAnalyser.L);

因此,在行中的代码

之后,在CanvasView类中没有看到H和L正在改变它们的值的事实
canvas.drawBitmap(bmp, (float)(X *kx)-15, (float) (Y *ky)-15 , null); 

被执行了。答案是

protected void onDraw(Canvas canvas ) {

方法必须在完成后擦除并一次又一次地重做。这可以通过写行

来实现
invalidate();

在onDraw方法的末尾。