2014-01-13 5 views
3

Я написал следующий код, чтобы сначала увеличить размер ImageView и после 100 мс уменьшить размер одного и того же ImageView. Однако этот код увеличивает размер ImageView, но он не уменьшает его размер, или код после 100 мс задержки не влияет на размеры imageView.setLayoutParams не работает второй раз

Что я делаю неправильно?

uiHandler.post(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     FrameLayout.LayoutParams layout = (android.widget.FrameLayout.LayoutParams) imageView.getLayoutParams(); 
     layout.height = (int) (2*iconsSizeInDP); 
     layout.width = (int) (2*iconsSizeInDP); 
     imageView.setLayoutParams(layout); 
     try 
     { 
      Thread.sleep(50); 
     } 
     catch (InterruptedException e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show(); 
     // following code block doesnt'affect imageView dimensions 
     layout.height = (int) iconsSizeInDP; 
     layout.width = (int) iconsSizeInDP; 
     imageView.setLayoutParams(layout); 
    } 
}); 

С уважением

+0

Попробуйте создать 'LayoutParams' снова на месте, где вы сказали, код не работает' FrameLayout.LayoutParams раскладка = (android.widget.FrameLayout.LayoutParams) ImageView. getLayoutParams(); '. Также увеличивайте время в 'Thread.sleep()'. Это может быть слишком сложно увидеть разницу. –

+0

Когда вы продолжаете блокировать поток пользовательского интерфейса со сном, в каком потоке вы думаете, что происходит повторная компоновка? – laalto

+0

Вы уверены, что второй Set не называется? используйте 'AsyncTask' вместо' uiHandler' и повторите попытку. первая часть в 'onPreExecute()' sleep in 'onBackground' и установите второй параметр в' onPostExeute() ' –

ответ

1

изменение компоновки 2 раза в том же интерфейсе поток, так что только последнее изменение может вступить в силу. Вы должны отделить 2 UI потока, как это:

uiHandler.post(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     FrameLayout.LayoutParams layout = (android.widget.FrameLayout.LayoutParams) imageView.getLayoutParams(); 
     layout.height = (int) (2*iconsSizeInDP); 
     layout.width = (int) (2*iconsSizeInDP); 
     imageView.setLayoutParams(layout); 
    } 
}; 
uiHandler.postDelayed(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     Toast.makeText(getApplicationContext(), "Hello", Toast.LENGTH_SHORT).show(); 
     // following code block doesnt'affect imageView dimensions 
     layout.height = (int) iconsSizeInDP; 
     layout.width = (int) iconsSizeInDP; 
     imageView.setLayoutParams(layout); 
    } 
},50); 
+0

Отличное решение для чувак! Кстати, почему он не работал в одном звонке? –

+0

Поскольку пользовательский интерфейс изменится только при завершении потока пользовательского интерфейса. – xtr

+0

Хорошо. Единственная проблема заключается в том, что imageView несколько раз изменяет размер, когда пользователь положил палец на изображение. Любая идея о том, как ее решить? –

0

, пожалуйста, посмотри на линии FrameLayout.LayoutParams layout = (android.widget.FrameLayout.LayoutParams) imageView.getLayoutParams();

, пожалуйста, посмотри, если попробовать сделать FrameLayout.LayoutParams layout глобальные

Смежные вопросы