【发布时间】: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