2011-12-30 112 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