3

質問はアンドロイド開発に関するもので、より正確にはボタンとカスタムビューに関するものです。Linear Layouts で 4 つのボタンを使用し、画像を描画するカスタム ビューを 1 つ使用しています。メソッドを使用してこれを行うと( onDraw() をオーバーライドします)、ボタンを押すとボタンの反応が非常に遅くなることを除けば、すべて正常に機能します。onDraw 関数を削除するだけで、すぐに機能します。私の質問は、これらのボタンの動作が遅いのはなぜですか? 理由がわかりません!カスタム ビューで自分で作成したボタンを使用する必要がありますか?

そして、これを解決する方法は?

これは、onDraw メソッドを使用するクラスです。

import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.ImageView;

public class test extends ImageView{  
Context mContext;
String[] medium;

final int pspawn[]={64,32};

public test(Context context, AttributeSet attrs) {         
    super(context, attrs);
    mContext = context;
}

private String getMapInfo(Integer counter){
    String[] mapArray = TextUtils.split(map, " ");
    return mapArray[counter];
}
public void onDraw(Canvas canvas){
    int x = 0;
    int y = 0;
    for(int i = 0; i<100; i = i+1)
    {
        String mapinfo = getMapInfo(i);
        if (mapinfo.equals("x"))
        {
            canvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(),R.drawable.t1), x, y, null);
        }
        x = x + 32;
        if (x == 320)
        {
            y = y + 32;
            x = 0;
        }
        canvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(),R.drawable.t3), pspawn[0], pspawn[1],null);
        invalidate();   
    }               
}
}

そして、これは私のメインクラスです:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class desimain extends Activity{

private Thread worker;
private Runnable newMsg;
private OnClickListener getKeystroke;


public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    getKeystroke = new OnClickListener(){
        public void onClick(View view) {
            switch(view.getId()){   
            case R.id.Up:
                worker = new Thread(newMsg);
                worker.start();
                break;   
            case R.id.Down:   
                Toast.makeText(getApplicationContext(), "Down", Toast.LENGTH_SHORT).show();     
                break;
            case R.id.Left:   
                Toast.makeText(getApplicationContext(), "Left", Toast.LENGTH_SHORT).show();     
                break; 
            case R.id.Right:   
                Toast.makeText(getApplicationContext(), "Right", Toast.LENGTH_SHORT).show();        
                break;
            }
        };
    };

    Button pressUp = (Button) findViewById (R.id.Up);
    pressUp.setOnClickListener(getKeystroke);
    Button pressDown = (Button) findViewById (R.id.Down);
    pressDown.setOnClickListener(getKeystroke);
    Button pressLeft = (Button) findViewById (R.id.Left);
    pressLeft.setOnClickListener(getKeystroke);
    Button pressRight = (Button) findViewById (R.id.Right);
    pressRight.setOnClickListener(getKeystroke);


    newMsg = new Runnable(){
        public void run() {
            runOnUiThread(new Runnable() {
                public void run() {
                    Toast.makeText(getApplicationContext(), "Up", Toast.LENGTH_SHORT).show();       
                    } 
                }); 
        }   
    };
}
}

PS: このコードがあまり美しくないことはわかっていますが、現時点では、必要な基本を理解しようとしています...

4

1 に答える 1

6

メソッドのメイン アプリケーション スレッドで時間がかかりすぎているため、ボタンが応答しませんonDraw()。描画ごとに 200 回フラッシュからファイルをロードするのではなく、ビットマップをキャッシュしてください。

于 2011-03-14T14:37:13.140 に答える