2017-04-10 57 views
0

我正在處理動畫,並且我想實現OnClickListener對於更簡潔的代碼有所不同。從活動中提取視圖並在OnClickListener中實現動畫

例如,我可以做到這一點。

注:我想運行我的工作,只有當active[0]true

MainActivity

final Boolean[] active = {false}; 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(active[0]){ 
       // do some work 
      }else{ 
       Animation animPictureDeactiveLeft = AnimationUtils.loadAnimation(MainActivity.this, R.anim.deactivate_picturebtn_onleft); 
       Animation animVideoMiniLeft = AnimationUtils.loadAnimation(MainActivity.this, R.anim.activate_videobtn_onleft); 
       Animation animGifMiniLeft = AnimationUtils.loadAnimation(MainActivity.this, R.anim.move_gifbtn_onleft); 

       ImageView btnCameraPic = (ImageView) findViewById(R.id.btnCapturePicture); 
       ImageView btnCameraVid = (ImageView) findViewById(R.id.btnCaptureVideo); 
       ImageView btnCameraGif = (ImageView) findViewById(R.id.btnCaptureGif); 

       btnCameraPic.startAnimation(animPictureDeactiveLeft); 
       btnCameraVid.startAnimation(animVideoMiniLeft); 
       btnCameraGif.startAnimation(animGifMiniLeft); 
       active[0] = true; 
      } 
     } 
    }); 

此代碼工作正常,但我不喜歡這個代碼風格。
所以,我想在其他地方實施OnClickListener

我嘗試了以下方法,但我不知道這是否是一種好方法。
如果沒有,請讓我知道什麼是最好的方法。

TestClick

public class TestClick extends AppCompatActivity implements OnClickListener { 
public static boolean bActive = false; 
@Override 
public void onClick(View v) { 
    if(bActive) { 
     active(); 
    }else{ 
     Animation animPictureDeactiveLeft = AnimationUtils.loadAnimation(TestClick.this, R.anim.deactivate_picturebtn_onleft); 
     Animation animVideoMiniLeft = AnimationUtils.loadAnimation(TestClick.this, R.anim.activate_videobtn_onleft); 
     Animation animGifMiniLeft = AnimationUtils.loadAnimation(TestClick.this, R.anim.move_gifbtn_onleft); 

     ImageView btnCameraPic = (ImageView) findViewById(R.id.btnCapturePicture); 
     ImageView btnCameraVid = (ImageView) findViewById(R.id.btnCaptureVideo); 
     ImageView btnCameraGif = (ImageView) findViewById(R.id.btnCaptureGif); 

     btnCameraPic.startAnimation(animPictureDeactiveLeft); 
     btnCameraVid.startAnimation(animVideoMiniLeft); 
     btnCameraGif.startAnimation(animGifMiniLeft); 
     bActive = true; 
    } 
} 

public void active(){ 

} 

} 

MainActivity

 button.setOnClickListener(new TestClick(){ 
     public void active(){ 
      // do some work 
     } 
    }); 

回答

0

如果你有TestClick extends AppCompatActivity,那麼這是錯誤的。

button.setOnClickListener(new TestClick(){ 
    public void active(){ 
     // do some work 
    } 
}); 

從不new一個活動。


如果您有一個實現該接口的活動。

public class TestClick extends AppCompatActivity implements OnClickListener 

然後這就是你如何使用它(假設按鈕是在當前的TestClick類)。

button.setOnClickListener(TestClick.this); 

而被覆蓋的onClickthis類,然後被調用。


或許TestClick不應擴大AppCompatActivity如果不是真的一個活動。

在這種情況下,你會想要一個簡單的類,而不是一個完整的活動

您還需要檢查被點擊,可能是按鈕。

public class TestClick implements OnClickListener { 
    private boolean bActive; 
    private final Context mContext; 

    public TestClick(Context context) { 
     this.mContext = context; 
    } 

    public void setActive(boolean active) { this.bActive = active; } 
    public boolean isActive() { return this.bActive; } 

    @Override 
    public void onClick(View v) { 
     if (v.getId() == R.id.your_button_id) { 
      if (this.isActive()) { 

      } else { 

      } 
     } 

然後你可以使用

button.setOnClickListener(new TestClick(MainActivity.this)); 

及注意事項:findViewById不能在這裏解決,所以你需要獲得其他的方式來引用您的看法。

+0

@ cricket007我在哪裏執行我的動畫?在'TestClick'或'MainActivity'中 –

+0

'TestClick'沒有任何'onCreate'方法。 'findViewById'將會失敗,因此你不能在那裏做任何動畫。所以讓'MainActivity ...實現View.OnClickListener' –

+0

@ cricket007我的主要目的是在單獨的類文件中組織動畫代碼。如果我無法在'clickListener'中管理動畫,則不需要在'MainActivity'中實現'OnClickListener'。 –

相關問題