从Activity中提取视图并在OnClickListener中实现动画

时间:2017-04-10 20:18:28

标签: java android 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
        }
    });

1 个答案:

答案 0 :(得分: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);

然后调用onClick类中的覆盖this

如果<{1}} 活动,则TestClick也不应该展开AppCompatActivity

在这种情况下,你需要一个简单的类,而不是一个完整的Activity

您还可能想要检查点击的按钮。

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无法在此解析,因此您需要获得另一种方式来引用您的观点。