2011-12-30 54 views
0

这看起来像一个愚蠢的问题,但您如何更改在屏幕上绘制的图片。我已经能够编程一个应用程序,它绘制了一个图标你会触摸屏幕。所以在我完成之后,我想通过添加一个选项菜单和改变你被淹死的图标来改善它,但当我运行代码时,图标图片保持不变。当我看着它发现当你点击任何一个菜单项时,它都会执行它并改变图像ID,但是当你回到主屏幕并尝试创建一个新图像时,它会回到旧图像。我没有想法为什么它不会改变,因为当我看到它时,一切都有助于它正确地改变图标。如果任何人对我做错了什么有任何想法或对如何做到这一点的任何建议,它将非常感谢如何更改在屏幕上绘制的图片

主要

public class main extends Activity { 

/** Called when the activity is first created. */ 



    MenuItem item2; 

    int item3=R.drawable.ic_launcher; 



@Override 

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    FrameLayout sv = new FrameLayout(this); 

    LinearLayout ll = new LinearLayout(this); 

    Panel test = new Panel(this); 

    //ImageButton button = new ImageButton(this); 



    ll.setOrientation(LinearLayout.VERTICAL); 

    sv.addView(test); 

    //ll.addView(button); 

    sv.addView(ll); 



    setContentView(sv); 



} 



public boolean onCreateOptionsMenu(Menu menu) { 

    // TODO Auto-generated method stub 

    MenuInflater inflater = getMenuInflater(); 

    inflater.inflate(R.menu.menu, menu); 

    return super.onCreateOptionsMenu(menu); 

} 



@Override 

public boolean onOptionsItemSelected(MenuItem item) { 

    // TODO Auto-generated method stub 



    Log.v("test", "item3 before is: "+item3); 



     item3=R.drawable.box; 



     Log.v("test", "item3 after is: "+item3); 





    return super.onOptionsItemSelected(item); 

    } 
    } 

面板

public class Panel extends SurfaceView implements SurfaceHolder.Callback { 

private Bitmap image; 

private ViewThread mThread; 

private int x; 

private int y; 

private ArrayList<Element> mElements = new ArrayList<Element>(); 



public Panel(Context context) { 

    super(context); 

    image = BitmapFactory.decodeResource(getResources(),yantz.imageapp4.R.drawable.test); 

    getHolder().addCallback(this); 

    mThread = new ViewThread(this); 



} 



public void doDraw(Canvas canvas) { 

    canvas.drawColor(Color.CYAN); 
    canvas.drawBitmap(image, x, y, null); 

    synchronized (mElements){ 

    for(Element element : mElements){ 

     element.doDraw(canvas); 

    } 

    } 





} 









@Override 

public boolean onTouchEvent(MotionEvent event) { 

    // TODO Auto-generated method stub 

    Log.v("test", "you have touched the sreen: "); 



    synchronized (mElements){ 

    mElements.add(new Element(getResources(),(int) event.getX(),(int) event.getY())); 

} 

return super.onTouchEvent(event); 

} 







@Override 

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

    // TODO Auto-generated method stub 

} 



@Override 

public void surfaceCreated(SurfaceHolder holder) { 

    if (!mThread.isAlive()) { 

     mThread = new ViewThread(this); 

     mThread.setRunning(true); 

     mThread.start(); 

    } 

} 



@Override 

public void surfaceDestroyed(SurfaceHolder holder) { 

    if (mThread.isAlive()) { 

     mThread.setRunning(false); 

    } 

} 

} 

元素

public class Element extends main{ 

private int mX; 

private int mY; 

int location ; 

private Bitmap mBitmap; 



public Element(Resources res, int x, int y) { 



    Log.v("element", "item3 before location is: "+item3); 



    location =item3; 

    mBitmap = BitmapFactory.decodeResource(res, location); 

    mX = x - mBitmap.getWidth()/2; 

    mY = y - mBitmap.getHeight()/2; 

    Log.v("element", "item3 before location is: "+item3); 



} 







public void doDraw(Canvas canvas) { 

    canvas.drawBitmap(mBitmap, mX, mY, null); 

} 



public void setlocation(int location2){ 

    location=location2; 

} 

} 

ViewThread

public class ViewThread extends Thread { 

    private Panel mPanel; 

    private SurfaceHolder mHolder; 

    private boolean mRun = false; 



    public ViewThread(Panel panel) { 

     mPanel = panel; 

     mHolder = mPanel.getHolder(); 

    } 



    public void setRunning(boolean run) { 

     mRun = run; 

    } 



    @Override 

    public void run() { 

     Canvas canvas = null; 

     while (mRun) { 

      canvas = mHolder.lockCanvas(); 

      if (canvas != null) { 

       mPanel.doDraw(canvas); 

       mHolder.unlockCanvasAndPost(canvas); 

      } 

     } 

    } 

}

+0

能否请您清楚解释您的问题?问题不清楚。 – 2011-12-30 05:42:41

+0

@YugandharBabu我的问题是我怎样才能改变我使用选项菜单画到我的surfaceview上的图片 – 2011-12-30 17:55:36

回答

0

可以使用

@Override 
protected void onResume() { 
    super.onResume(); 
    id="what ever you want"; 
//and set it to imagevIew; 
} 

如果我理解了题目了正确的,这是因为你的活动暂停的时候它不集中,使用默认值恢复。

+0

我尝试了你的建议文森特和我同意dyour想法编程是诉诸默认值问题是Onreume()不修复它我在debuger中运行代码,它只在一开始就运行一次。当它确实认为它和OnOptionSelect做了同样的事情时,它改变了变量的值,但是当你尝试在屏幕上绘制图像时,它还原了回到类变量值不是你刚刚改变它为OnResume()和OnOptionSelect()发生的那个。我向你展示调试器的屏幕截图,但是我目前无法在stackoverflow上 – 2011-12-30 18:28:29