【问题标题】:view.getTop() reutrns wrong resultview.getTop() 返回错误结果
【发布时间】:2014-02-25 16:54:53
【问题描述】:

我有这个xml,带有布局表面(不覆盖整个屏幕):

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/FrameLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="bottom"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="10dp"
        android:orientation="vertical" >
    </LinearLayout>


    <LinearLayout
        android:id="@+id/surface"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_weight="1" >
    </LinearLayout>




<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginEnd="0dp"
    android:layout_gravity="bottom" >

    <ImageView
        android:id="@+id/right"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignTop="@+id/down"
        android:layout_toRightOf="@+id/down"
        android:src="@drawable/right" />

    <ImageView
        android:id="@+id/left"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignTop="@+id/down"
        android:layout_toLeftOf="@+id/down"
        android:src="@drawable/left" />

    <ImageView
        android:id="@+id/up"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentTop="true"
        android:layout_toLeftOf="@+id/right"
        android:src="@drawable/up" />

    <ImageView
        android:id="@+id/down"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_below="@+id/up"
        android:layout_centerHorizontal="true"
        android:src="@drawable/down" />
</RelativeLayout>

</LinearLayout>

我在 mainActivity 中控制了surface,并尝试在它的边框上绘制一个宽度为 10px 的框架。

这里是mainActivity:

            public class MainActivity extends Activity  {
        GameView gv;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.game_view);
            LinearLayout surface = new LinearLayout(this);
            surface = (LinearLayout)findViewById(R.id.surface);
            gv= new GameView(this,surface);
            surface.addView(gv);
    }
}

这里是 GameView 类:

   public class GameView extends SurfaceView implements Runnable {

        private boolean isRunning=false;
        private final long FPS=12;
        int PART_SIZE=6;

        private SurfaceHolder holder;
        Thread snakethread;
        LinearLayout view;


    public GameView(Context context,LinearLayout view) {
        super(context);
        this.view=view;
        this.a=new Arena();
        snakethread=new Thread(this);
        holder= getHolder();
        this.setBackgroundColor(Color.TRANSPARENT);                 
        this.setZOrderOnTop(true);
        getHolder().setFormat(PixelFormat.TRANSPARENT);

        holder.addCallback(new SurfaceHolder.Callback(){

            @Override
            public void surfaceCreated(SurfaceHolder arg0) {
                setRunning(true);
                snakethread.start();

            }

            @Override
            public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,int arg3) {



            }

            @Override
            public void surfaceDestroyed(SurfaceHolder arg0) {

                setRunning(false);

                while(true){
                    try {
                        snakethread.join();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
    });
}

    public void run() {
        long stepPerSecond=1000/FPS;
        long startTime;
        long sleepTime;
        Canvas c = null;
        try{
            c=this.getHolder().lockCanvas();
            synchronized (this.getHolder()) {
               c.drawColor(Color.BLUE);
               Paint p=new Paint();
               p.setColor(Color.BLACK);
               c.drawRect(view.getLeft(), view.getTop(), view.getLeft()+10, view.getBottom(),p);
               c.drawRect(view.getLeft(), view.getTop(),view.getRight(),view.getTop()+10,p);
               c.drawRect(view.getRight()-10, view.getTop(), view.getRight(),view.getBottom(),p);
               c.drawRect(view.getLeft(), view.getBottom()-10, view.getRight(),view.getBottom(),p);
                }
        }
        catch(Exception e){
        }
        finally{
            if(c!=null){
                this.getHolder().unlockCanvasAndPost(c);
            }
        }

    }

问题是整个框架在视图的顶部下方大约 6px,在应该在的位置下方。我的意思是 view.getTop()view.getBottom() 返回一个磨损的结果,一个大约 6px 的结果大于它应该是的结果(如果视图的顶部坐标是 x,那么它返回 x+6)。

【问题讨论】:

  • 您是否尝试过使用 getLocationInWindow() 来获取视图的窗口位置?听起来很像您没有考虑 TitleBar(是的,除非使用 Theme.NoTitleBar,否则您必须这样做)
  • 如何使用 getLocationInWindow() 获得视图的底部?

标签: android canvas android-linearlayout android-view


【解决方案1】:

花了 2 天后我找到了解决方案

int top = view.getTop(); 
int bottom = view.getBottom();  

// use these line instead of upper code 
 int statusBarHeight = (int) Math.ceil(25 * context.getResources().getDisplayMetrics().density);
 int top = (childTextView.getBottom()+childTextView.getHeight())-statusBarHeight ;
 int bottom = (childTextView.getTop()+childTextView.getHeight())-statusBarHeight ;

【讨论】:

  • 嘿伙计,我真的很感谢你的尝试。我大约在 3 年前离开了这个项目,所以我不知道你解决了什么问题,但我真的很佩服你试图帮助和修复一些 3 年前发布的帖子。希望它能帮助其他人解决未来的问题
猜你喜欢
  • 2021-05-05
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多