Android中的精确定位

Android中的精确定位,android,Android,我正在开发一个应用程序,需要将图像精确定位在某个x和y位置。图像将随机移动到新位置 我看不出如何做到这一点。即使android鼓励使用布局(因为屏幕有多种尺寸、尺寸和质量分辨率,布局在所有设备上都是相同的) 有两种其他方法可以做到这一点 1) 更改opengl视图的所有内容^^^^但这需要一个佳能才能得到一只蚊子 2) 创建自己的视图,覆盖onDraw(画布)并在那里绘制自己的图形 我必须警告你,把所有的画都正确地放在画布上是非常乏味的 编辑 下面是一些代码,让您开始以编程方式创建视图,我还添

我正在开发一个应用程序,需要将图像精确定位在某个x和y位置。图像将随机移动到新位置


我看不出如何做到这一点。

即使android鼓励使用布局(因为屏幕有多种尺寸、尺寸和质量分辨率,布局在所有设备上都是相同的)

有两种其他方法可以做到这一点

1) 更改opengl视图的所有内容^^^^但这需要一个佳能才能得到一只蚊子

2) 创建自己的视图,覆盖onDraw(画布)并在那里绘制自己的图形

我必须警告你,把所有的画都正确地放在画布上是非常乏味的


编辑 下面是一些代码,让您开始以编程方式创建视图,我还添加了触摸测试

(我想提请大家注意的一件事是:有一个image.getWidth()(图片的实际大小)和一个image.getScaledWidth(canvas),它给出了dp中元素的大小,这意味着它在屏幕上的显示大小)

public类MainMenuView扩展了PixelRainView{
私有位图bmpPlay=null;
私有浮动playLeft=0;
私有浮动playRight=0;
私有浮动播放底部=0;
私有浮动playTop=0;
公共主菜单视图(上下文、属性集属性){
超级(上下文,attrs);
}
@凌驾
公共位图(){
super.unload位图();
if(bmpPlay!=null){
bmpPlay.recycle();
bmpPlay=null;
}
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
if(bmpPlay==null){
bmpPlay=GetBitMapFromResourceId(R.drawable.play_bt);
playLeft=(this.getWidth()-bmpPlay.getScaledWidth(canvas))/2;
playRight=playLeft+bmpPlay.getScaledWidth(画布);
playTop=(this.getHeight()-bmpPlay.getscaledeheight(canvas))/2;
playboottom=playTop+bmpPlay.getScaledHeight(画布);
}
drawBitmap(bmpPlay、playLeft、playTop、null);
}       
}
@凌驾
已更改尺寸的受保护空心(整数w、整数h、整数oldw、整数oldh){
super.onSizeChanged(w,h,oldw,oldh);
}
@凌驾
公共布尔onTouchEvent(运动事件){
if(event.getAction()==MotionEvent.ACTION\u向下){
float x=event.getX();
float y=event.getY();
//测试中央按钮

如果(x>playLeft&&x)使用什么布局?绝对布局、线性布局、相对布局?图像具有哪些属性?是否使用dp(密度无关像素)?给我们一些见解!使用LinearLayout。我使用DP。我没有尝试过很多,因为我毫无头绪。我打算尝试AbsoluteLayout,但听说它已被弃用。a结果仍然存在,但被标记为弃用,所以我想很快它将不再受支持。我将代码用于创建您自己的视图,但正如您将看到的,这是一个恼人的过程,并且您需要无论屏幕大小如何,都必须添加更多的代码以使其看起来更漂亮^^我宁愿保持简单,呵呵。我知道0 opengl,第二个选项似乎很乏味。据我所知,这是使用(x,y)的唯一方法在androidOh上放置元素好吗,你知道有教程吗?事实上,我从来没有找过教程,我算出来了,哈哈,但我在我的帖子中添加了一个只画一个按钮的版本
public class MainMenuView extends PixelRainView{
    private Bitmap bmpPlay = null;
    private float playLeft = 0;
    private float playRight = 0;
    private float playBottom = 0;
    private float playTop = 0;

    public MainMenuView(Context context, AttributeSet attrs) {
        super(context,attrs);
    }



    @Override
    public void unLoadBitmaps() {
        super.unLoadBitmaps();
        if(bmpPlay != null){
            bmpPlay.recycle();
            bmpPlay = null;
        }
    }



    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(bmpPlay == null){
            bmpPlay = getBitmapFromRessourceID(R.drawable.play_bt);
            playLeft = (this.getWidth()-bmpPlay.getScaledWidth(canvas))/2; 
            playRight = playLeft + bmpPlay.getScaledWidth(canvas);
            playTop = (this.getHeight()-bmpPlay.getScaledHeight(canvas))/2;
            playBottom = playTop+bmpPlay.getScaledHeight(canvas);
        }
        canvas.drawBitmap(bmpPlay,playLeft, playTop, null);

        }       
    }


    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }



    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            float x = event.getX();
            float y = event.getY();
            //test central button
            if(x>playLeft && x<playRight && y<playBottom && y>playTop){
                Log.e("jason", "touched play");
                PixelRainView.changeView(R.layout.composedlayoutgroup);
            }
        return super.onTouchEvent(event);
    }
}