2016-07-04 3 views
0

Кажется, я не могу найти ответ на мой вопрос о Google или SO, поэтому позвольте мне попытаться объяснить его правильно.Android Fragment Animation для пользовательских представлений

У меня есть основное действие, которое создает пользовательский фрагмент. Этот CustomFragment затем содержит несколько пользовательских «расширенных» кнопок (представлений), в которых к ним применяется ObjectAnimator.

Этот ObjectAnimator не обновляет основной поток (я предполагаю), хотя isRunning() возвращает true. ObjectAnimator отлично работает внутри CustomFragment, но при использовании его внутри класса Extended Button он терпит неудачу.

Я думаю, что мне нужно использовать runOnUiThread() или каким-либо другим способом заставить его работать на нужном потоке, но я не смог найти хорошее решение.

Вот некоторые psuedocode:

public class TestButton extends Button{ 
    private AnimatorSet as; 

    public TestButton(Context context, AttributeSet attrs){ 
     super(context, attrs); 
     init(); 
    } 

    private void init(){ 
     ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(this, "alpha", 0.2f, 1.0f); 
     as = new AnimatorSet(); 
     as.play(alphaAnimator); 
     as.setDuration(1000); 
    } 

    public void startAnimation(){ 
     as.start(); 
     //tried adding invalidate(); here but that didn't seem to fix it either 
    } 
} 

public class CustomFragment extends android.support.v4.app.Fragment implements Runnable { 

    private View root; 
    private ArrayList<TestButton> buttons; 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, bundle SavedInstanceState){ 
     root = inflater.inflate(R.layout.fraglayout, container, false); 

     initButtons(); 
     return view; 
    } 

    private void initButtons(){ 
     buttons = new ArrayList<TestButton>(); 
     //Code here to initialize and find the buttons in the layout, this works properly 
     //so I won't define it here because it is long, the list does contain its members 
     // 
    } 

    private void startTest(View view){ 
     //An actual "Button" controls this, and is called properly 

     //THE FOLLOWING WORKS PERFECTLY FINE 
     ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(view, "alpha", 0.2f, 1.0f); 
     alphaAnimator.setDuration(1000); 
     alphaAnimator.start(); 

     //THIS DOES NOT WORK AT ALL, JUST CHANGES THE VIEW ONCE BUT ANIMATION DOESNT 'RUN' 
     for(TestButton b : buttons){ 
      b.startAnimation(); 
     } 
    } 

    @Override 
    public void run(){ 

     root.postDelayed(this,1000); 
    } 
} 

Это должно быть что-то с резьбой, но я не уверен, что это могло быть.

Любая помощь приветствуется,

Благодаря

--- Edit --- Хорошо, так что я просто Мессинг вокруг с резьбой и добавил простой булево, чтобы проверить, является ли или нет, чтобы начать анимации в функции Run() фрагмента. И это работает для анимации, однако это не похоже на правильный способ сделать это, потому что у меня будет много булеан, чтобы проверить, что должен быть какой-то другой способ запускать функцию в потоке, возвращаясь к runOnUiThread() Но я не уверен, как его использовать. Это то, что я делал, что работает в помещении, но не является правильным программированием.

private void startTest(View view){ 
     tester = true; 
    } 

    @Override 
    public void run(){ 
     if(tester){ 
      for(TestButton b : buttons) 
       b.startAnimation(); 
      tester = false; 
     } 
     root.postDelayed(this,1000); 
    } 

--- Edit 2 --- This seems to work, and helped me out. Если кто-то нуждается в этом в будущем.

ответ

0

Following this guide, это, похоже, хорошо.

public class TestButton extends Button{ 
    private AnimatorSet as; 
    private Handler handler; 

    public TestButton(Context context, AttributeSet attrs){ 
     super(context, attrs); 
     handler = new Handler(context.getMainLooper()); 
     init(); 
    } 

    private void init(){ 
     //Does get called properly 

     ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(this, "alpha", 0.2f, 1.0f); 
     as = new AnimatorSet(); 
     as.play(alphaAnimator); 
     as.setDuration(1000); 
    } 

    public void startAnimation(){ 
     runOnUiThread(new Runnable(){ 
      @Override 
      public void run(){ 
       as.start(); 
      } 
     }); 
     as.start(); 
    } 

    private void runOnUiThread(Runnable r){ 
     handler.post(r); 
    } 
}