2016-12-03 152 views
0

我有兩個視圖v1和v2。我的目標是,當用戶按下並保存v1時,v2將使用動畫進行擴展。當用戶放開v1時,v2停止擴展。按住按鈕修改視圖屬性

這是我的onCreate是什麼樣子:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    root = findViewById(R.id.root); 
    shape = findViewById(R.id.shape); 

    root.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      switch (event.getAction()) { 

       case MotionEvent.ACTION_DOWN: { 
        isExpanding = true; 
        expandView(shape); 
       } return true; 

       case MotionEvent.ACTION_UP: { 
        isExpanding = false; 
        shrinkView(shape); 
       } return true; 

       default: return false; 
      } 

     } 
    }); 
} 

對於expandView()和shrinkView(),我嘗試添加含有isExpanding while循環,並增加在那裏的動畫:

private void shrinkView(final View view) { 
    while (!isExpanding) { 
     view.animate().scaleXBy(0.1f).scaleYBy(0.1f); 
    } 
} 

我也嘗試更改循環內的LayoutParams:

private void expandView(final View view) { 
    while (isExpanding) { 
     final ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); 
     currWidth = layoutParams.width; 
     currHeight = layoutParams.height; 
     currWidth = +GROWTH_FACTOR; 
     currHeight = +GROWTH_FACTOR; 
     layoutParams.width += currWidth; 
     layoutParams.height += currHeight; 
     view.setLayoutParams(layoutParams); 
     view.invalidate(); 
    } 
} 

但是這兩個塊都會e ui線程如預期。

+0

Ui線程由於無限循環而被阻止 –

+0

@AbhishekPatel正確,因此爲什麼我需要幫助:) –

回答

1

那麼對於這種類型的動畫,我將使用ObjectAnimator來縮放X和Y.然後,我將向該ObjectAnimator添加一個偵聽器,並在onAnimationEnd中檢查用戶是否仍在按下(isExpanding)。如下面的代碼:

View v2 = findViewById(R.id.v2);//lets say u have v2 and v1 
     final ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(v2, "scaleX", 0.5f); 
    final ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(v2, "scaleY", 0.5f); 
    scaleDownX.setDuration(1000); 
    scaleDownY.setDuration(1000); 


    final AnimatorSet scaleAnimation = new AnimatorSet(); 
    scaleAnimation.play(scaleDownX).with(scaleDownY); 
    scaleAnimation.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      super.onAnimationEnd(animation); 
      if (isExpanding) { 
       scaleAnimation.start(); 
      } 
     } 
    }); 


      findViewById(R.id.v1).setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      switch (motionEvent.getAction()) { 

       case MotionEvent.ACTION_DOWN: { 
        isExpanding = true; 
        if (!scaleAnimation.isRunning()) { 
         scaleAnimation.start(); 
        } 

       } 
       return true; 

       case MotionEvent.ACTION_UP: { 
        isExpanding = false; 
        scaleAnimation.cancel(); 
       } 
       return true; 

       default: 
        return false; 
      } 
     } 
    }); 

希望這會有所幫助。

+0

感謝您分享此內容,但它無效:/我的視圖根本沒有改變! –

+0

更新了答案.. setOnTouchListener而不是setOnKeyListener,播放是定義設置,而.start()是啓動它:) –

0

您可以使用調用它的發佈方法每隔固定的時間間隔產生的AsyncTask,在呼叫擴大V2。這將釋放你的UI線程來聽取v1的發佈。

或者另一種方法是,當用戶持有V1啓動一個線程,讓該線程post回更新(修改V2)。您也可以在v1發佈時終止線程。