Здесь я предполагаю, что вы имеете в виду SurfaceView, где вы используете фоновый поток для рисования на поверхности, а вы используете SurfaceHolder.CallBack (). Это не полный ответ, однако, эта проблема также мучила меня некоторое время. В моем позднем ночном поиске неисправностей мне удалось собрать обходной путь, который может быть немного более элегантным, чем ваш. В результате ничего не рисуется, пока поверхность не изменилась до своего последнего состояния, поэтому пользователь не знает, что происходит.
При изменении поверхности вы заметите, что ваша высота или ширина не изменяются на правильное значение, другими словами, поверхность результата, если она нарисована, имеет значение MalFormed. То, что вам нужно, это справочное значение того, какими должны быть ваши рост и ширина, вы можете получить это, поместив следующий код перед SetContentView () в вашей основной деятельности:
WindowManager w = getWindowManager();
Display d = w.getDefaultDisplay();
int Meausredwidth = d.getWidth();
int Measuredheight = d.getHeight();
Теперь из ваших измеренных высоты и ширины определите, сколько вы назначаете для SurfaceView, и передайте эти значения в SurfaceView в качестве глобальных переменных. И убедитесь, что вы вызываете вышеуказанный код в onconfigurationchanged () в своей основной деятельности, чтобы эти значения каждый раз пересчитывались. Теперь на вашем SurfaceView, который должен каким-то образом реализовывать SurfaceHolder.Callback, измените свою поверхность, чтобы она выглядела следующим образом:
@Override
public void surfaceChanged(SurfaceHolder mholder, int format, int width,
int height) {
if (width != mWidth) {
MalFormed = true;
thread.setRunning(false);
count++;
} else if (width == mWidth) {
if (MalFormed) {
MalFormed = false;
Log.d("ROTATE", "ReDraw");
thread = new DrawingThread(this, holder, mHandler);
thread.setRunning(true);
thread.start();
}
}
}
Где mWidth - желаемая ширина. Здесь вам может потребоваться изменить оператор if в зависимости от вашей конкретной проблемы. А MalFormed - это глобальное логическое значение в вашем виде поверхности.
Теперь важно помнить, что если происходит изменение, то SurfaceChanged () вызывается до SurfaceCreated, что означает, что мы можем легко изменить любой код, который пытается взаимодействовать с потоком, в соответствии с нашими вышеупомянутыми изменениями.
Так что где бы вы ни пытались присоединиться или запустить этот фоновый поток рисования, вы должны сначала проверить, является ли поверхность MalFormed. Э.Г.
if (thread.getState() == State.TERMINATED){
if(!MalFormed){
holder.removeCallback(this);
holder = getHolder();
holder.addCallback(this);
thread = new DrawingThread(this, holder,mHandler);
thread.setRunning(true);
thread.start();
}
}else{
if(!MalFormed){
thread.setRunning(true);
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Надеюсь, я где-нибудь на стадионе. Всего наилучшего.