java – 使用自定义方法绘制到画布?
发布时间:2020-12-15 02:26:16 所属栏目:Java 来源:网络整理
导读:我正在编写一个 Android 2-D游戏,我遇到了一些麻烦. 目前,在我的包中,我有一个绘制画布实例的线程.我正在从资源中绘制Drawable位图.我想做的是让线程处理背景图像的绘制.但是,自定义对象的实例可以使用可绘制对象绘制到同一个画布.这在逻辑上似乎是可能的,但
我正在编写一个
Android 2-D游戏,我遇到了一些麻烦.
目前,在我的包中,我有一个绘制画布实例的线程.我正在从资源中绘制Drawable位图.我想做的是让线程处理背景图像的绘制.但是,自定义对象的实例可以使用可绘制对象绘制到同一个画布.这在逻辑上似乎是可能的,但我无法让它工作.每当我尝试检索自定义类中的资源时,应用程序在启动时崩溃. 以下是我的一些努力:(如果我做了一些愚蠢的事情,请不要笑,我正在努力.) 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); } 正如你所看到的,我尝试了几种不同的方法,并且我也尝试过(扩展活动)添加到我的班级,但我无法弄清楚这一点. 这段代码并没有解决实际绘制到画布的问题,我还没有跨过那座桥 编辑:这是活动.如你所见,它在月球视图中调用一个线程.该线程实例化需要检索Drawable的对象.如何以神的名义获取对象的应用程序上下文?还是有其他办法吗?是的,这是来自android示例代码的代码. 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's 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,R.string.menu_start); menu.add(0,MENU_STOP,R.string.menu_stop); menu.add(0,MENU_PAUSE,R.string.menu_pause); menu.add(0,MENU_RESUME,R.string.menu_resume); menu.add(0,MENU_EASY,R.string.menu_easy); menu.add(0,MENU_MEDIUM,R.string.menu_medium); menu.add(0,MENU_HARD,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's 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; } 解决方法
正如Greg建议的那样,问题在于获得正确的Context来检索资源.
解决此问题的一种简单方法是将主Activity作为参数传递给Worker类构造函数,并将其另存为私有Context字段.就像是: public class Worker{ private Context mContext; public Worker (Context context) { mContext = context; Resources res = mContext.getResources(); // all the rest of your code } } 您将在主要活动中使用它: Worker worker = new Worker(this); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |