gpt4 book ai didi

java - 膨胀 View

转载 作者:行者123 更新时间:2023-12-02 06:08:24 26 4
gpt4 key购买 nike

我需要使用view.getWidth(),但我不能,因为我还没有膨胀 View 。在使用 view.getWidth() 之前如何膨胀 View ?

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;
Snake snake;
Arena a;
Brick food;
LinearLayout view;
Bitmap arena;

public GameView(Context context,LinearLayout view) {
super(context);
this.view=view;
arena = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
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();
}
}
}
});
snake=new Snake(20, 50, "RIGHT",PART_SIZE);
}

public void run() {
long stepPerSecond=1000/FPS;
long startTime;
long sleepTime;
Canvas c = null;
try{
c=this.getHolder().lockCanvas();
synchronized (this.getHolder()) {
ArenaDraw(c);
}
}
catch(Exception e){
}
finally{
if(c!=null){
this.getHolder().unlockCanvasAndPost(c);
}
}
while(isRunning){
c=null;
startTime=System.currentTimeMillis();
try{
c=this.getHolder().lockCanvas();
synchronized (this.getHolder()) {
Paint p=new Paint();
snakeDraw(c);
}
}
catch(Exception e){
}
finally{
if(c!=null){
this.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime= stepPerSecond-(System.currentTimeMillis()-startTime);
if(sleepTime>0)
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

最佳答案

您可以使用ViewTreeObserver:

final ViewTreeObserver observer = surface.getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
observer.removeOnPreDrawListener(this);
// do what you need to do, getWidth() is now valid
surface.getWidth();
return false; // will not draw this initial frame
}
});

请注意,仅膨胀 View 是不够的。在 getWidth() 生效之前,您的 View 需要通过 inflate-measure-layout 生命周期。

了解更多关于how android draws views的信息.

关于java - 膨胀 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22098714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com