我正在开发一款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正在执行。
有没有人知道为什么会这样?
提前谢谢。
答案 0 :(得分:0)
你是否尝试过没有postInvalidate()?
(你似乎没有使用多线程)
您也可以尝试使用Canvas,因为您可能需要高刷新率...
在官方文档上查看此主题,一切都得到了很好的解释:http://developer.android.com/guide/topics/graphics/2d-graphics.html
答案 1 :(得分:0)
虽然我可能没有回答您的具体问题,但请允许我就您的实际代码向我提出建议。
如果我理解正确,您只想在放大特定图像时“移动”。
困扰我的第一件事是:
这意味着每次用户触摸屏幕时,您都要求Android设备的CPU创建新的位图。如果让用户在屏幕上滑动手指,这似乎非常危险。必须在很短的时间内分配大量的资源,而且没有充分的理由。您应该只创建一次位图,然后以更好的方式重复使用它。
这提出了我的第二点。
您是否考虑过使用OpenGL ES来执行此操作?假设你能理解它的基础,它会让你的生活变得更轻松。然后,您将使用GPU渲染所谓的Image。更不用说你可以使用一个非常有用的“相机”(GluLookAt),名称说明一切,看看你想要的图像部分,同时能够非常容易地放大和缩小。
虽然我知道学习OpenGL ES10可能会有很大的帮助,但它将是最有效的解决方案。
我希望这可以帮助你!