1

画像をフルスクリーンで表示したいAndroidアプリを開発しています。次に、この画像の上に小さな「ウィンドウ」を表示します。

  • ウィンドウは、ユーザーが画面に触れる場所に配置されます。
  • このウィンドウの内容は、拡大された元の画像の一部です。拡大された画像の部分は、ユーザーが画面に触れた位置によっても定義されます。

このようにして、ユーザーが画面に沿って指を動かすと、「ウィンドウ」が指に追従し、元の画像のズーム バージョンが表示されます。

今までは、ズームされた画像で「ウィンドウ」の内容を更新することを除いて、やりたいことはすべてできました。

次のコードを書きました。

public class DetectEyesActivity extends Activity implements OnTouchListener {
//DetectEyesView detectEyesView;
//LinearLayout mLinearLayout;
TextView text;
ImageView imgView;
Bitmap imgBitmap;
ImageView touchView2;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    setContentView(R.layout.detecteyeslayout);

    Intent intent = this.getIntent();
    byte[] image = intent.getByteArrayExtra("Image");

    text = (TextView) findViewById(R.id.detectEyesTextView1);
    imgView = (ImageView) findViewById(R.id.detectEyesImageView1);

    imgBitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
    imgView.setImageBitmap(imgBitmap);
    //imgView.setOnTouchListener(this);



    text.setTextSize(30);
    text.setText("A");



    touchView2 = (ImageView) findViewById(R.id.detectEyesImageView2);

    Bitmap temp = Bitmap.createBitmap(imgBitmap, 200, 200, 200, 200);
    touchView2.setImageBitmap(temp);
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    //event.getX()
    int y = (int)event.getY();
    int x = (int)event.getX();
    float aux = (float)imgBitmap.getHeight() / (float)imgView.getHeight();
    //float imgBitmapHeight = 
    //float imgBitmapWidth = (float)imgBitmap.getWidth()/aux
    float imgDrawableX = (imgView.getWidth() - (float)imgBitmap.getWidth()/aux  ) / 2 + imgView.getX();
    float imgDrawableY = (imgView.getHeight() - (float)imgBitmap.getHeight()/aux  ) / 2 + imgView.getY();
    text.setText("TouchX = " + x + "   TouchY = " + y + " ImageX: "+ imgDrawableX  + " ImageY: "+ imgDrawableY + " aux = " + aux);



    Bitmap temp = Bitmap.createBitmap(imgBitmap, x, y, 50, 50);
    //touchView2.setImageBitmap(temp);
    touchView2.setVisibility(0);
    touchView2.bringToFront();
    touchView2.layout(x-200, y-200, x-30, y-30);
    touchView2.postInvalidate();
    touchView2.invalidate();
    Log.v("x,y",event.getY()+","+event.getX());



    return true;
}

このコードでは、ウィンドウは内容を更新せずに指に従います。行のコメントを外すと

    //touchView2.setImageBitmap(temp);

ウィンドウは単に表示されません。それにもかかわらず、textView のコンテンツは更新され続けます。だから私は onTouchEvent が実行されていることを知っています。

なぜこれが起こっているのか誰にも分かりますか?

前もって感謝します。

4

2 に答える 2

0

あなたの具体的な質問には答えられないかもしれませんが、あなたの実際のコードについて私の考えを述べさせてください。

私の理解が正しければ、ズームインしながら特定の画像を「移動」するだけです。

私を悩ませている最初のことはこれです:

  • ビットマップ temp = Bitmap.createBitmap(imgBitmap, x, y, 50, 50); *

これは、ユーザーが画面に触れるたびに、Android デバイスの CPU に新しいビットマップの作成を要求していることを意味します。たとえば、ユーザーが画面上で指を滑らせた場合、これは非常に危険に思えます。正当な理由もなく、非常に短い時間で大量のリソースを割り当てなければなりません。ビットマップを一度だけ作成してから、より良い方法で再利用する必要があります。

これは私の 2 番目のポイントをもたらします。

これを行うために OpenGL ES を使用することを検討しましたか? その基礎を理解できれば、人生がずっと楽になります。次に、GPU を使用して、いわゆるイメージをレンダリングします。言うまでもなく、非常に便利な「カメラ」(GluLookAt)を使用して、その名前がす​​べてを表し、画像の必要な部分を見て、非常に簡単にズームインおよびズームアウトできます。

OpenGL ES10 を学習するのは難しいかもしれないことは理解していますが、それが最も効率的な解決策になるでしょう。

これが何らかの形で役立つことを願っています!

于 2012-05-25T19:12:19.433 に答える
0

postInvalidate() なしで試しましたか?
(マルチスレッドを使用していないようです)高いリフレッシュレートが必要な場合があるため、Canvas を使用することもできます...
公式ドキュメントでこのトピックを見てください。すべてがよく説明されています:http://developer .android.com/guide/topics/graphics/2d-graphics.html

于 2012-05-25T15:26:25.297 に答える