ok, tôi đã tìm được giải pháp làm việc cho mọi loại chế độ xem.
một số ghi chú:
buồn bã nó sử dụng một bitmap kích thước của các quan điểm, nhưng chỉ trong một khoảng nhỏ của thời gian.
sau đó, nó giữ vị trí được xem xét trên khu vực hiển thị và được xem ở bên ngoài khu vực hiển thị.
tôi có thể làm cho bộ nhớ thân thiện hơn bằng cách tạo một mảng các số nguyên có cờ. hiện tại nó là một mảng boolean đơn giản.
tôi có thể kiểm tra giá trị alpha của bitmap trong JNI thay thế và tránh thời gian (ngắn) nơi tôi có cả bitmap và mảng cùng nhau.
nếu có ai đó có thể giúp cải thiện, điều đó thực sự tuyệt vời.
đây là các mã:
public class MainActivity extends Activity
{
boolean[] _inVisibleAreaMap;
private int _width,_height;
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final View view=findViewById(R.id.imageView1);
view.setDrawingCacheEnabled(true);
runJustBeforeBeingDrawn(view,new Runnable()
{
@Override
public void run()
{
final Bitmap bitmap=view.getDrawingCache();
_width=bitmap.getWidth();
_height=bitmap.getHeight();
_inVisibleAreaMap=new boolean[_width*_height];
for(int y=0;y<_width;++y)
for(int x=0;x<_height;++x)
_inVisibleAreaMap[y*_width+x]=Color.alpha(bitmap.getPixel(x,y))!=0;
view.setDrawingCacheEnabled(false);
bitmap.recycle();
}
});
view.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(final View v,final MotionEvent event)
{
final int x=(int)event.getX(),y=(int)event.getY();
boolean isIn=x>=0&&y>=0&&x<_width&&y<_height;
// if inside bounding box , check if in the visibile area
if(isIn)
isIn=_inVisibleAreaMap[y*_width+x];
if(isIn)
Log.d("DEBUG","in");
else Log.d("DEBUG","out");
return true;
}
});
}
private static void runJustBeforeBeingDrawn(final View view,final Runnable runnable)
{
final ViewTreeObserver vto=view.getViewTreeObserver();
final OnPreDrawListener preDrawListener=new OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
runnable.run();
final ViewTreeObserver vto=view.getViewTreeObserver();
vto.removeOnPreDrawListener(this);
return true;
}
};
vto.addOnPreDrawListener(preDrawListener);
}
}
trong trường hợp IMAGExem đã thiết lập chiều rộng của nó & chiều cao để wrap_content, và nó thực sự có kích thước cần thiết, chỉ sau đó bạn có thể sử dụng Adnan Zahid solution, mà có thể là được viết theo cách này:
public class MainActivity extends Activity
{
private int _width,_height;
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView image=(ImageView)findViewById(R.id.imageView1);
final Bitmap bitmap=((BitmapDrawable)image.getDrawable()).getBitmap();
_width=bitmap.getWidth();
_height=bitmap.getHeight();
image.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(final View v,final MotionEvent event)
{
final int x=(int)event.getX(),y=(int)event.getY();
boolean isIn=x>=0&&y>=0&&x<_width&&y<_height;
if(isIn)
{
final int pixel=bitmap.getPixel((int)event.getX(),(int)event.getY());
final int alphaValue=Color.alpha(pixel);
isIn=alphaValue!=0;
}
if(isIn)
Log.d("DEBUG","in");
else Log.d("DEBUG","out");
return true;
}
});
}
}
Nguồn
2013-08-28 21:28:11
điều này thực sự có vẻ đầy hứa hẹn! tôi sẽ cần phải kiểm tra xem nó ra trước khi tôi đánh dấu câu trả lời của bạn, mặc dù. có thể có vấn đề: điều gì sẽ xảy ra trên các màn hình thiết bị khác nhau (mật độ/độ phân giải khác nhau)? nó vẫn sẽ hoạt động? Ngoài ra, hiện phương pháp này sử dụng bộ nhớ nhiều hơn theo cách này cho bitmap? –
cũng có thể hoạt động ngay cả khi tôi không sử dụng bitmap để hiển thị trong chế độ xem không? –
Nếu bạn đang thiết kế cho các màn hình khác nhau, bạn vẫn phải sử dụng các mảnh vỡ. Và đối với bitmap, tôi nghĩ rằng sử dụng một hình ảnh nút đồng bằng sẽ không sử dụng nhiều bộ nhớ vì nó có thể dễ dàng được thu nhỏ mà không làm mất nhiều chi tiết. Cuối cùng, có, bạn có thể sử dụng phương pháp drawbitmap nhưng điều đó sẽ yêu cầu một canvas vì vậy tôi khuyên bạn nên sử dụng một imageview thay thế. –