Drawing on canvas using a custom method?

I am coding a two-dimensional android game and I am having problems.

Currently, in my package, I have a thread that relies on a canvas instance. I am drawing Drawable bitmaps from resources. What I would like to do is save a stream that will draw a background image. But there are instances of custom objects that can draw on the same canvas using the available objects. This seems logical, but I can't get it to work. Every time I try to restore resources in my class, the application starts at startup.

Here are some of my efforts: (please don’t laugh if I did something stupid, I try.)

public class Worker{ //Get drawables // Resources res = getResources(); // Drawable man1 = res.getDrawable(R.drawable.workertest); // Context mContext; // Resources res = mContext.getResources(); // Drawable man1 = mContext.getResources().getDrawable(R.drawable.workertest); // Drawable man2 = mContext.getResources().getDrawable(R.drawable.workertest1); // Drawable man1 = res.getDrawable(R.drawable.workertest); // Drawable man2 = res.getDrawable(R.drawable.workertest1); } 

As you can see, I tried several different methods, and I also tried to add (extends activity) to my class, but I cannot figure it out.

This code does not apply to drawing on canvas, I have yet to cross this bridge

Edit: here is the activity. As you can see, this causes a thread in lunarview. This thread creates an instance of the object that should be drawn. How do I get the context of the application to the object in the name of the gods? or is there another way to do this? And yes, this is the code from the Android sample code.

 public class LunarLander extends Activity { private static final int MENU_EASY = 1; private static final int MENU_HARD = 2; private static final int MENU_MEDIUM = 3; private static final int MENU_PAUSE = 4; private static final int MENU_RESUME = 5; private static final int MENU_START = 6; private static final int MENU_STOP = 7; /** A handle to the thread that actually running the animation. */ public static LunarThread mLunarThread; /** A handle to the View in which the game is running. */ public LunarView mLunarView; /** * Invoked during init to give the Activity a chance to set up its Menu. * * @param menu the Menu to which entries may be added * @return true */ @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, MENU_START, 0, R.string.menu_start); menu.add(0, MENU_STOP, 0, R.string.menu_stop); menu.add(0, MENU_PAUSE, 0, R.string.menu_pause); menu.add(0, MENU_RESUME, 0, R.string.menu_resume); menu.add(0, MENU_EASY, 0, R.string.menu_easy); menu.add(0, MENU_MEDIUM, 0, R.string.menu_medium); menu.add(0, MENU_HARD, 0, R.string.menu_hard); return true; } /** * Invoked when the user selects an item from the Menu. * * @param item the Menu entry which was selected * @return true if the Menu item was legit (and we consumed it), false * otherwise */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_START: mLunarThread.doStart(); return true; case MENU_STOP: mLunarThread.setState(LunarThread.STATE_LOSE, getText(R.string.message_stopped)); return true; case MENU_PAUSE: mLunarThread.pause(); return true; case MENU_RESUME: mLunarThread.unpause(); return true; case MENU_EASY: mLunarThread.setDifficulty(LunarThread.DIFFICULTY_EASY); return true; case MENU_MEDIUM: mLunarThread.setDifficulty(LunarThread.DIFFICULTY_MEDIUM); return true; case MENU_HARD: mLunarThread.setDifficulty(LunarThread.DIFFICULTY_HARD); return true; } return false; } /** * Invoked when the Activity is created. * * @param savedInstanceState a Bundle containing state saved from a previous * execution, or null if this is a new execution */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // tell system to use the layout defined in our XML file setContentView(R.layout.lunar_layout); // get handles to the LunarView from XML, and its LunarThread mLunarView = (LunarView) findViewById(R.id.lunar); mLunarThread = mLunarView.getThread(); // give the LunarView a handle to the TextView used for messages mLunarView.setTextView((TextView) findViewById(R.id.text)); if (savedInstanceState == null) { // we were just launched: set up a new game mLunarThread.setState(LunarThread.STATE_READY); Log.w(this.getClass().getName(), "SIS is null"); } else { // we are being restored: resume a previous game mLunarThread.restoreState(savedInstanceState); Log.w(this.getClass().getName(), "SIS is nonnull"); } } /** * Invoked when the Activity loses user focus. */ @Override protected void onPause() { super.onPause(); mLunarView.getThread().pause(); // pause game when Activity pauses } /** * Notification that something is about to happen, to give the Activity a * chance to save state. * * @param outState a Bundle into which this Activity should save its state */ @Override protected void onSaveInstanceState(Bundle outState) { // just have the View thread save its state into our Bundle super.onSaveInstanceState(outState); mLunarThread.saveState(outState); Log.w(this.getClass().getName(), "SIS called"); } public boolean onTouchEvent(MotionEvent event){ int clickX = Math.round(event.getX()/10)*10; int clickY = Math.round(event.getY()/10)*10; LunarView.xCo = clickX; LunarView.yCo = clickY; return true; } 
+4
source share
1 answer

As Greg suggested, the problem is getting the right Context for resource extraction. An easy way to solve this is to pass the main Activity as an argument in the constructor of the Worker class and save it as a private Context field. Sort of:

 public class Worker{ private Context mContext; public Worker (Context context) { mContext = context; Resources res = mContext.getResources(); // all the rest of your code } } 

You will use it in your main action as:

 Worker worker = new Worker(this); 
+1
source

All Articles