android,在Touch事件中添加多个ImageView

android,在Touch事件中添加多个ImageView,android,touch-event,dynamically-generated,Android,Touch Event,Dynamically Generated,我刚刚开始为Android编程。我一直在寻找我的问题,但这些建议对我没有帮助。我希望相同的图像出现在触摸屏坐标中。我就是这么做的: @覆盖 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); 视图主视图=(视图)findViewById(R.id.main\u视图); main_view.setOnTouchListe

我刚刚开始为Android编程。我一直在寻找我的问题,但这些建议对我没有帮助。我希望相同的图像出现在触摸屏坐标中。我就是这么做的:

@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
视图主视图=(视图)findViewById(R.id.main\u视图);
main_view.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
ImageView image=新的ImageView(getApplicationContext());
//ImageView图像=(ImageView)findViewById(R.id.Breaked);
image.setImageResource(R.drawable.breaked);
image.setX(event.getX()+image.getWidth()/2);
image.setY(event.getY()-image.getHeight()/2);
LinearLayout top_layout=(LinearLayout)findViewById(R.id.top_layout);
LayoutParams p=新的LayoutParams(LayoutParams.WRAP\u内容,LayoutParams.WRAP\u内容);
image.setLayoutParams(p);
顶部布局。添加视图(图像);
返回true;
}
});
}

我觉得一切都很好,但当触摸屏幕时,什么也没发生。我犯的明显错误在哪里?提前感谢。

setX和setY不设置图像位置。它基本上是在适当的位置滚动图像。该位置由其父视图控制。由于其父对象是线性布局,因此在布局中,它将始终位于其上方对象的下方或右侧。如果你想把它精确地放在某个地方,你需要把它放在一个支持它的父级中,比如不推荐的AbsoluteLayout

您不能在
线性布局中执行此操作。
让我们改用
FrameLayout

活动\u main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/framelayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</FrameLayout>

ImageView image=newimageview(getApplicationContext())
您应该使用活动上下文-
ImageView image=newimageview(MyActivity.this)-其中MyActivity是活动类的名称。请从代码中删除setX和setY行,然后重试。您确定在xml布局文件中没有任何不可见的根视图吗?Simon,仅更改上下文后没有任何更改。除第一条语句外,我几乎同意所有内容。如果我们查看文档:“public void setX(float x);设置此视图的可视x位置,以像素为单位”,那么原因是LinearLayout。谢天谢地,这不是它所说的职位。我同意,它的文档写得很糟糕。但是,整个视图层次系统的观点是,您从不关心绝对x和y位置。函数引用的x和y不是相对于屏幕或父对象的x和y,因为视图不知道如何计算它。很抱歉,您误解了(错误的)文档。另外,请阅读下面的完整说明“这相当于将translationX属性设置为传入的x值与当前left属性之间的差值”。这与内容的x偏移有关,而不是视图的位置。Benito,非常感谢。它很好用。唯一的一件事(在我看来),它不是很好的styled=),我把OnTouchListener放在了不同的类中
public class MainActivity extends Activity {

    private FrameLayout mLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mLayout = (FrameLayout) findViewById(R.id.framelayout);
        mLayout.setOnTouchListener(mListener);

    }

    private OnTouchListener mListener = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:
                return true;

            case MotionEvent.ACTION_UP:
                // decode the resource to get width and height
                Options opts = new Options();
                opts.inJustDecodeBounds = true;
                BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher, opts);

                int imageWidth = opts.outWidth;
                int imageHeight = opts.outHeight;

                // set the imageview's top and left margins
                FrameLayout.LayoutParams lp = new LayoutParams(imageWidth, imageHeight);
                lp.leftMargin = (int) (event.getX() - (imageWidth / 2));
                lp.topMargin = (int) (event.getY() - (imageHeight / 2));

                ImageView image = new ImageView(MainActivity.this);
                image.setImageResource(R.drawable.ic_launcher);
                mLayout.addView(image, lp);

                return false;

            }
            return false;
        }
    };

}