Поверхностный вид холста. @ Переопределить при нажатии клавиши
Метод onKeyDown не работает. Когда я нажимаю кнопку, растровое изображение не перемещается. Когда это делается напрямую, положив j=j+5; внутри холста это работает. Когда делали это прямо в onkeydown j+5, то тоже не двигались.
public class SmileyView extends SurfaceView implements SurfaceHolder.Callback {
public SmileyView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
holder = getHolder();
s= BitmapFactory.decodeResource(context.getResources(),R.drawable.smiley);
holder.addCallback(this);
sd=context.getResources().getDrawable(R.drawable.lander_plain);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
return rv.dokey();
}
private int i=100;private int j=0;
private Bitmap s;private SurfaceHolder holder;private RenderView rv ;
boolean grun=true;long t=0;private boolean key=false;private Drawable sd;volatile private int f=0;
public void resume()
{
rv=new RenderView();
}
@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder arg0) {
// TODO Auto-generated method stub
grun=true;
if(rv!=null)
rv.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder arg0) {
// TODO Auto-generated method stub
try {
grun =false;
rv.join();
rv=null;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class RenderView extends Thread {
RenderView(){
super();
}
@Override
public void run()
{
SurfaceHolder h=holder;
while(grun)
{
Canvas ca=null;
try{ca = h.lockCanvas(null);
synchronized (h) {
dodraw(ca);
}
}
finally
{
if(ca!=null)
h.unlockCanvasAndPost(ca);
}
}
}
public void dodraw(Canvas canvas)
{ canvas.drawColor(Color.BLACK);
canvas.drawBitmap(s, j, j, null);
sd.setBounds(10, 10, 230, 180);
sd.draw(canvas);
key =false;
canvas.restore();
}
boolean dokey()
{
j=j+5;
return true;
}
}
}
2 ответа
Решение
Представление должно быть сфокусировано, чтобы принимать ключевые события, и помимо принудительной фокусировки на элементе, нет хорошего способа заставить ваш SmileyView сфокусироваться. Вместо этого переопределите onKeyDown в своей деятельности, чтобы пройти через ключевое событие, если этот вид поверхности является единственным на экране:
public class MyActivity extends Activity {
private SmileyView mSmileyView
@Override
protected boolean onKeyDown(int keyCode, KeyEvent event) {
return mSmileyView.onKeyDown(keyCode, event);
}
}
Вы пытались отладить? J должен быть синхронизирован. Вы редактируете его из одного потока и используете в рендере