2017-04-10 27 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'。 –

相关问题