开发缩放跟随窗口

时间:2012-05-25 14:37:47

标签: android android-layout android-imageview

我正在开发一款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正在执行。

有没有人知道为什么会这样?

提前谢谢。

2 个答案:

答案 0 :(得分:0)

你是否尝试过没有postInvalidate()?
(你似乎没有使用多线程) 您也可以尝试使用Canvas,因为您可能需要高刷新率...
在官方文档上查看此主题,一切都得到了很好的解释:http://developer.android.com/guide/topics/graphics/2d-graphics.html

答案 1 :(得分:0)

虽然我可能没有回答您的具体问题,但请允许我就您的实际代码向我提出建议。

如果我理解正确,您只想在放大特定图像时“移动”。

困扰我的第一件事是:

  • 位图temp = Bitmap.createBitmap(imgBitmap,x,y,50,50); *

这意味着每次用户触摸屏幕时,您都要求Android设备的CPU创建新的位图。如果让用户在屏幕上滑动手指,这似乎非常危险。必须在很短的时间内分配大量的资源,而且没有充分的理由。您应该只创建一次位图,然后以更好的方式重复使用它。

这提出了我的第二点。

您是否考虑过使用OpenGL ES来执行此操作?假设你能理解它的基础,它会让你的生活变得更轻松。然后,您将使用GPU渲染所谓的Image。更不用说你可以使用一个非常有用的“相机”(GluLookAt),名称说明一切,看看你想要的图像部分,同时能够非常容易地放大和缩小。

虽然我知道学习OpenGL ES10可能会有很大的帮助,但它将是最有效的解决方案。

我希望这可以帮助你!