我创建了一个扩展View的类,以便在特定的位置自己绘制它。
我已经覆盖了onDraw
方法:
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(pic, x, y, null);
}
当我设置单击侦听器并将视图添加到布局时,即使我没有单击视图的区域,事件也会触发。
我尝试设置布局参数来包装内容没有帮助,尝试删除“super.onDraw
”也没有帮助。
如果我使用内置视图(如按钮或图像视图)执行相同的操作,则不会发生这种情况。
有什么问题?我做错了吗?
更多代码:
public class FlowingPicture extends View {
private float x,y;
private Bitmap pic;
private int screenWidth;
private int screenHeight;
public FlowingPicture(Context context, Bitmap pic, int x, int y, WindowManager screenSize) {
super(context);
screenHeight = screenSize.getDefaultDisplay().getHeight();
screenWidth = screenSize.getDefaultDisplay().getWidth();
this.pic = pic;
this.x = x;
this.y = y;
}
public void move(float x, float y){
this.x += x;
if(this.x > screenWidth)
this.x = -(this.pic.getWidth());
this.y += y;
this.postInvalidate();
}
public float getX(){
return x;
}
public float getY(){
return y;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(pic, x, y, null);
}
}
创建视图的代码部分:
for(int i=0; i<arr.size(); i++){
Bitmap b = arr.get(i).getFlowProfilePic();
int x, y;
do{
y = rand.nextInt(screenHeight - b.getHeight() - 30);
x = rand.nextInt(screenWidth);
}
while (!checkPoint(x, b.getWidth(), y, b.getHeight()));
takenPoints.add(new Point(x, y));
FlowingPicture fp = new FlowingPicture(FlowingFeeds.this, b, -(x + b.getWidth()), y, getWindowManager());
fp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(FlowingFeeds.this, "I'm working!", Toast.LENGTH_SHORT).show();
}
});
fp.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
flowingObjectsList.add(fp);
}
parseHandler.sendEmptyMessage(0);
parseHandler将视图添加到布局:
for(FlowingPicture fp : flowingObjectsList){
layout.addView(fp);
}
flow = new Thread(FlowingFeeds.this);
flow.start();
最后一部分:
layout = new FrameLayout(this);
layout.setBackgroundColor(Color.WHITE);
setContentView(layout);
答案 0 :(得分:0)
尝试在您的方法中最后调用super.onDraw(canvas)
,但这可能会或可能不会让您想去的地方。
很难说出你的错误,但是你尝试在布局中声明BitmapField。除非需要显示更多内容,否则看起来你正在为屏幕绘制图像。
同样在main.xml
中,您可以在RelativeLayout
内创建所需内容,并包含TextFields
,BitmapFields
以及您需要的其他字段, ,您不必担心onDraw()
。
使用XML资源的好处是有一个属性android:onClick="someMethod"
。在活动中,您需要一个方法:
public void someMethod( View view ) {
// do stuff here
}
这样就没有必要和听众混在一起了。
答案 1 :(得分:0)
好的,我没有解决它,但我想我知道问题是什么。 因为我正在整个屏幕上移动视图,所以它为视图提供了屏幕大小的空间。 所以我只是在视图所在的布局上添加一个触摸侦听器,它采用触摸的x和y,并检查此触摸是否在某个视图上。 不是最优雅的解决方案,但我尽了最大努力!
感谢所有试图提供帮助的人! :)