如何将相同的OnClickListener设置为所有(多个)ImageView(s)

时间:2015-09-15 17:00:45

标签: java android imageview android-animation android-imageview

我正在制作某种益智游戏,其中会有很多由ImageView组成的块。现在在这种情况下,我只有setOnClickListener到imageView1,而不是我为每个ImageView编写相同的setOnClickListener块,如何为所有ImageView编写一次setOnclickListener?

这是示例代码

MainActivity.java

public class MainActivity extends Activity {

    ImageView imageView1, imageView2, imageView3;
    int x, y;

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

        x = 0;
        y = 0;

        imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);

        imageView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
                animation.setDuration(1000);
                animation.setFillAfter(false);
                animation.setAnimationListener(new MyAnimationListener());

                imageView1.startAnimation(animation);
                x += 0;
                y += 50;

            }
        });
    }

    private class MyAnimationListener implements Animation.AnimationListener {

        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            imageView1.clearAnimation();
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(imageView1.getWidth(),
                imageView1.getHeight());
            lp.setMargins(x, y, 0, 0);
            imageView1.setLayoutParams(lp);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    }
}

我的代码的所有建议和改进都非常受欢迎。提前谢谢。

6 个答案:

答案 0 :(得分:2)

您可以尝试在变量中创建侦听器,然后将其分配给每个ImageView。像这样:

imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);

        View.OnClickListener listener= new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
                animation.setDuration(1000);
                animation.setFillAfter(false);

                ImageView vista=(ImageView) v;
                animation.setAnimationListener(new MyAnimationListener(vista));


                vista.startAnimation(animation);

                x += 0;
                y += 50;

            }
        };

        imageView1.setOnClickListener(listener);
        imageView2.setOnClickListener(listener);
        imageView3.setOnClickListener(listener);

        private class MyAnimationListener implements Animation.AnimationListener {

            ImageView selected;
            public MyAnimationListener(ImageView vista)
            {
                selected=vista;
            }

            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                selected.clearAnimation();
                RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(selected.getWidth(),
                        selected.getHeight());
                lp.setMargins(x, y, 0, 0);
                selected.setLayoutParams(lp);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        }

尝试使用它:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) {

            Cursor cursor = (Cursor) parent.getAdapter().getItem(position);
            //TODO
            }
});

答案 1 :(得分:1)

您可以使用下面的Activity实现自定义OnClickListener,

public class MainActivity extends Activity implements View.OnClickListener{

    ImageView imageView1, imageView2, imageView3;
    int x, y;

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

        x = 0;
        y = 0;

        imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);

        imageView1.setOnClickListener(this);
        imageView2.setOnClickListener(this);
        imageView3.setOnClickListener(this);
    }
@Override
public void onClick(View v) {
   TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
                animation.setDuration(1000);
                animation.setFillAfter(false);
                animation.setAnimationListener(new MyAnimationListener(v));

                v.startAnimation(animation);
                x += 0;
                y += 50;
}
    private class MyAnimationListener implements Animation.AnimationListener {
        private View mView;

        public MyAnimationListener(View v)
       {
           this.mView = v;
       }
        @Override
        public void onAnimationStart(Animation animation) {

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            mView.clearAnimation();
            RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(mView.getWidth(),
                mView.getHeight());
            lp.setMargins(x, y, 0, 0);
            mView.setLayoutParams(lp);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {

        }
    }
}

答案 2 :(得分:0)

Create a distinct listener:

View.OnclickListener listener = new View.OnClickListener() {
            @Override 
            public void onClick(View v) {
                TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
                animation.setDuration(1000);
                animation.setFillAfter(false);
                animation.setAnimationListener(new MyAnimationListener());

                v.startAnimation(animation);
                x += 0;
                y += 50;

            } 
        }; 

然后将监听器设置为您的视图: imageView1.setOnClickListener(listener); imageView2.setOnClickListener(listener); imageView3.setOnClickListener(listener);

答案 3 :(得分:0)

让MainActivity实现OnClickListener并调用

public class MainActivity extends Activity implements OnClickListener {

    ImageView imageView1, imageView2, imageView3;
    int x, y;

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

        x = 0;
        y = 0;

        imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);
        imageView1.setOnClickListener(this);
        imageView2.setOnClickListener(this);
        imageView3.setOnClickListener(this);

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.image1:
            TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 50);
            animation.setDuration(1000);
            animation.setFillAfter(false);
            animation.setAnimationListener(new MyAnimationListener());

            imageView1.startAnimation(animation);
            x += 0;
            y += 50;
        break;
        case R.id.image2:
        break;
        case R.id.image3:
        break;
        }
    }
}

答案 4 :(得分:0)

您始终可以将您的类扩展为活动并实现OnClickListener。然后你应该重写OnClick函数。它将视图作为参数,您可以检查它是否是您想要的视图(即您的图像视图)

例如:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

/**
 * Created by Rohan on 15-09-2015.
 */
public class MyActivity extends Activity implements View.OnClickListener{

    ImageView imageView1, imageView2, imageView3;
    int x, y;

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

        x = 0;
        y = 0;

        imageView1 = (ImageView) findViewById(R.id.image1);
        imageView2 = (ImageView) findViewById(R.id.image2);
        imageView3 = (ImageView) findViewById(R.id.image3);

        imageView1.setOnClickListener(this);
        imageView2.setOnClickListener(this);
        imageView3.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == R.id.image1 || v.getId() == R.id.image2 || v.getId() == R.id.image3 ){
            //Do your stuff
        }
    }
}

答案 5 :(得分:0)

尽管您的代码在Java中,但是在kotlin中有一种简单的方法可以使某人发现有用。您可以为视图列表创建扩展功能

扩展功能:

fun List<View>.setOnClickListener(onClickView: () -> Unit) {
    this.forEach { it.setOnClickListener { onClickView.invoke() } }
}

使用方法:

listOf(ImageView, ImageView2, ImageView3).setOnClickListener { 
    // put your action here 
}