Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么只有50%的提款权被提取?_Android_Drawable - Fatal编程技术网

Android 为什么只有50%的提款权被提取?

Android 为什么只有50%的提款权被提取?,android,drawable,Android,Drawable,我试图创建一个简单的应用程序,在触摸屏幕的地方绘制png图形。我所遇到的问题是,只有我添加的图形的每个其他实例才是真正渲染的。每次我添加一个新实例时,模式都会交替。我总是只得到50%的图形渲染 我在HTC Hero上使用android level 3 为了进一步解释这个问题,这是我从surface holder回调调用的draw方法: public void surfaceCreated(SurfaceHolder holder) { drawOK = true; drawIcon(1

我试图创建一个简单的应用程序,在触摸屏幕的地方绘制png图形。我所遇到的问题是,只有我添加的图形的每个其他实例才是真正渲染的。每次我添加一个新实例时,模式都会交替。我总是只得到50%的图形渲染

我在HTC Hero上使用android level 3

为了进一步解释这个问题,这是我从surface holder回调调用的draw方法:

 public void surfaceCreated(SurfaceHolder holder) {
  drawOK = true;
  drawIcon(100.0f, 100.0f);//line-1
  drawIcon(50.0f, 100.0f);//line-2
  drawIcon(100.0f, 50.0f);//line-3
  drawIcon(50.0f, 50.0f);//line-4
  //drawIcon(200.0f, 200.0f);//line-5
  //drawIcon(100.0f, 200.0f);//line-6
 }
当注释掉第5行和第6行时(如图所示),我只看到渲染的第2行和第4行。当我在第5行中添加时,我会看到渲染的第1、3和5行。最后,当我添加第6行时,我看到第2、4和6行被渲染

为什么会这样

更详细地解释应用程序的其余部分。我有以下xml布局:

<SurfaceView android:id="@+id/SurfaceView01" android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"/>
即,我链接调用,并使用R类设置内容视图。然后,我获取对曲面视图的引用,并将该活动注册为曲面持有者回调

我有一个将图标绘制到屏幕上的方法。就是这样:

private void drawIcon(float x, float y) {
  if (!drawOK) return;
  Canvas canvas = holder.lockCanvas();
         // getting instance each time in case problem is related to reusing obj
         mFiringImage = getResources().getDrawable(R.drawable.icon);
         //so i can see overlapping icons, to rule out clipping issues
      mFiringImage.setAlpha(125); 
         // This mutate call is incase the bounds are shared state, which i doubt
      mFiringImage.mutate().setBounds( 
       (int)x-mFiringImage.getIntrinsicWidth()/2, 
       (int)y-mFiringImage.getIntrinsicHeight()/2, 
       (int)x+mFiringImage.getIntrinsicWidth()/2, 
       (int)y+mFiringImage.getIntrinsicHeight()/2
      );
      mFiringImage.draw(canvas);
      holder.unlockCanvasAndPost(canvas);
 }
也就是说,我锁定画布,获取可绘制的png资源,设置边界(使用mutate以防万一),并要求可绘制者在画布上绘制自己。注意,除非创建了曲面,否则我不会绘制

我真的很困惑

谢谢你的帮助

p、 以下是完整的清单:

package com.mypackage;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class Toucher extends Activity implements SurfaceHolder.Callback {
 private Drawable mFiringImage;
 private SurfaceView surfaceView;
 private boolean drawOK;
 private SurfaceHolder holder;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);

  // register our interest in hearing about changes to our surface
  holder = surfaceView.getHolder();
  holder.addCallback(this);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  float x = event.getX();
  float y = event.getY();
  Log.e(getClass().getSimpleName(), "=========================");
  Log.e(getClass().getSimpleName(), "Action="+event.getAction());
  Log.e(getClass().getSimpleName(), "History Size="+event.getHistorySize());
  Log.e(getClass().getSimpleName(), "Pressure="+event.getPressure());
  Log.e(getClass().getSimpleName(), "Raw X="+event.getRawX());
  Log.e(getClass().getSimpleName(), "Raw Y="+event.getRawY());
  Log.e(getClass().getSimpleName(), "X="+x);
  Log.e(getClass().getSimpleName(), "Y="+y);
  Log.e(getClass().getSimpleName(), "Precision X="+event.getXPrecision());
  Log.e(getClass().getSimpleName(), "Precision Y="+event.getYPrecision());
  Log.e(getClass().getSimpleName(), "Size="+event.getSize());
  Log.e(getClass().getSimpleName(), "=========================");

  drawIcon(x, y);

  return super.onTouchEvent(event);
 }

 private void drawIcon(float x, float y) {
  if (!drawOK) return;
  Canvas canvas = holder.lockCanvas();
  mFiringImage = getResources().getDrawable(R.drawable.icon);
  mFiringImage.setAlpha(125);
  mFiringImage.mutate().setBounds(
    (int)x-mFiringImage.getIntrinsicWidth()/2, 
    (int)y-mFiringImage.getIntrinsicHeight()/2, 
    (int)x+mFiringImage.getIntrinsicWidth()/2, 
    (int)y+mFiringImage.getIntrinsicHeight()/2
  );
  mFiringImage.draw(canvas);
  holder.unlockCanvasAndPost(canvas);
 }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  drawOK = true;
  drawIcon(100.0f, 100.0f);//1
  drawIcon(50.0f, 100.0f);//2
  drawIcon(100.0f, 50.0f);//3
  drawIcon(50.0f, 50.0f);//4
  //drawIcon(200.0f, 200.0f);//5
  //drawIcon(100.0f, 200.0f);//6
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub

 }

 @Override
 public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);

  if (!hasFocus) drawOK = false;
 }
}

会不会有两张画布?我锁的那个。另一个正在渲染到屏幕上?在这种情况下,确保在两张画布上都画东西的最佳实践是什么?android文档中这样说。我认为我的理解过于字面:0):注意:每次从SurfaceHolder检索画布时,画布的先前状态都将保留。为了正确设置图形动画,必须重新绘制整个曲面。例如,可以通过使用drawColor()填充颜色或使用drawBitmap()设置背景图像来清除画布的先前状态。否则,您将看到以前执行的绘图的痕迹。请尝试正确缩进代码,编辑器顶部有一个按钮,上面有“110110”,您只需选择代码并单击它即可。否则,你写的东西读起来简直是疯了。道歉。我运行noscript,看不到那些按钮。我想知道如何把它格式化好。它需要空格而不是制表符吗?我不是这样写代码的:0(
package com.mypackage;

import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class Toucher extends Activity implements SurfaceHolder.Callback {
 private Drawable mFiringImage;
 private SurfaceView surfaceView;
 private boolean drawOK;
 private SurfaceHolder holder;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  surfaceView = (SurfaceView) findViewById(R.id.SurfaceView01);

  // register our interest in hearing about changes to our surface
  holder = surfaceView.getHolder();
  holder.addCallback(this);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  float x = event.getX();
  float y = event.getY();
  Log.e(getClass().getSimpleName(), "=========================");
  Log.e(getClass().getSimpleName(), "Action="+event.getAction());
  Log.e(getClass().getSimpleName(), "History Size="+event.getHistorySize());
  Log.e(getClass().getSimpleName(), "Pressure="+event.getPressure());
  Log.e(getClass().getSimpleName(), "Raw X="+event.getRawX());
  Log.e(getClass().getSimpleName(), "Raw Y="+event.getRawY());
  Log.e(getClass().getSimpleName(), "X="+x);
  Log.e(getClass().getSimpleName(), "Y="+y);
  Log.e(getClass().getSimpleName(), "Precision X="+event.getXPrecision());
  Log.e(getClass().getSimpleName(), "Precision Y="+event.getYPrecision());
  Log.e(getClass().getSimpleName(), "Size="+event.getSize());
  Log.e(getClass().getSimpleName(), "=========================");

  drawIcon(x, y);

  return super.onTouchEvent(event);
 }

 private void drawIcon(float x, float y) {
  if (!drawOK) return;
  Canvas canvas = holder.lockCanvas();
  mFiringImage = getResources().getDrawable(R.drawable.icon);
  mFiringImage.setAlpha(125);
  mFiringImage.mutate().setBounds(
    (int)x-mFiringImage.getIntrinsicWidth()/2, 
    (int)y-mFiringImage.getIntrinsicHeight()/2, 
    (int)x+mFiringImage.getIntrinsicWidth()/2, 
    (int)y+mFiringImage.getIntrinsicHeight()/2
  );
  mFiringImage.draw(canvas);
  holder.unlockCanvasAndPost(canvas);
 }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  drawOK = true;
  drawIcon(100.0f, 100.0f);//1
  drawIcon(50.0f, 100.0f);//2
  drawIcon(100.0f, 50.0f);//3
  drawIcon(50.0f, 50.0f);//4
  //drawIcon(200.0f, 200.0f);//5
  //drawIcon(100.0f, 200.0f);//6
 }

 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub

 }

 @Override
 public void onWindowFocusChanged(boolean hasFocus) {
  super.onWindowFocusChanged(hasFocus);

  if (!hasFocus) drawOK = false;
 }
}