[java] Android에서 버튼처럼 imageview 클릭 효과를 주려면 어떻게해야합니까?

내 Android 앱에 onClick 이벤트가있는 버튼처럼 사용하고있는 imageview가 있지만 클릭 할 때 imageview에 클릭 가능한 효과를주지 않는다고 짐작할 수 있습니다. 어떻게 할 수 있습니까?



답변

클릭 / 비 클릭 상태에 대해 서로 다른 이미지를 디자인하고 다음과 같이 onTouchListener에서 설정할 수 있습니다.

final ImageView v = (ImageView) findViewById(R.id.button0);
        v.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                switch (arg1.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    v.setImageBitmap(res.getDrawable(R.drawable.img_down));
                    break;
                }
                case MotionEvent.ACTION_CANCEL:{
                    v.setImageBitmap(res.getDrawable(R.drawable.img_up));
                    break;
                }
                }
                return true;
            }
        });

더 나은 선택은 다음과 같이 선택자를 정의하는 것입니다.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true"
        android:drawable="@drawable/img_down" />
    <item android:state_selected="false"
        android:drawable="@drawable/img_up" />
</selector>

이벤트에서 이미지를 선택하십시오.

v.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                v.setSelected(arg1.getAction()==MotionEvent.ACTION_DOWN);
                return true;
            }
        });


답변

다음과 같이 단일 이미지로이를 수행 할 수 있습니다.

     //get the image view
    ImageView imageView = (ImageView)findViewById(R.id.ImageView);

    //set the ontouch listener
    imageView.setOnTouchListener(new OnTouchListener() {

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

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    ImageView view = (ImageView) v;
                    //overlay is black with transparency of 0x77 (119)
                    view.getDrawable().setColorFilter(0x77000000,PorterDuff.Mode.SRC_ATOP);
                    view.invalidate();
                    break;
                }
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_CANCEL: {
                    ImageView view = (ImageView) v;
                    //clear the overlay
                    view.getDrawable().clearColorFilter();
                    view.invalidate();
                    break;
                }
            }

            return false;
        }
    });

더 쉽게 재사용 할 수 있도록 ImageView의 하위 클래스 (또는 ImageView의 하위 클래스 인 ImageButton)로 만들 것입니다. 그러나 이렇게하면 “선택된”모양을 imageview에 적용 할 수 있습니다.


답변

그것은 함께 할 수있어 하나의 이미지 파일 ColorFilter 방법을 사용. 그러나 ColorFilter는 버튼이 아닌 ImageView와 함께 작동 할 것으로 예상하므로 버튼을 ImageView로 변환해야합니다. 어쨌든 이미지를 버튼으로 사용하는 경우 문제가되지 않지만 텍스트가 있으면 더 짜증이납니다 … 어쨌든 텍스트 문제를 해결하는 방법을 찾은 경우 사용할 코드는 다음과 같습니다.

ImageView button = (ImageView) findViewById(R.id.button);
button.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);

그러면 버튼에 빨간색 오버레이가 적용됩니다 (색상 코드는 완전히 불투명 한 빨간색의 16 진수 코드입니다. 처음 두 자리는 투명성이고 다음은 RR GG BB입니다.)


답변

편집 : 아래의 원래 답변이 작동하고 설정하기 쉽지만 더 효율적인 구현을 원하거나 필요로하는 경우 Google의 Android Developer Advocate 가이 게시물 을 참조하십시오 . 또한 android:foreground속성은 Android M에서 기본적으로 ImageView를 포함한 모든 뷰 에 제공됩니다.


ImageView에 대한 선택기를 사용할 때의 문제점은보기의 배경으로 만 설정할 수 있다는 것입니다. 이미지가 불투명 한 한 그 뒤에있는 선택기의 효과를 볼 수 없습니다.

트릭은 콘텐츠에 android:foreground대한 오버레이 를 정의 할 수 있는 속성 을 사용 하여 FrameLayout에 ImageView를 래핑하는 것입니다 . 우리가 설정 한 경우 android:foreground선택기에 (예 : ?android:attr/selectableItemBackgroundAPI 레벨 11 + 용) 및 첨부 OnClickListener우리가 원하는 클릭 효과 – 이미지 뷰 대신 FrameLayout이에, 이미지는 우리의 선택의 당김과 중첩 될 것이다!

보다:

<FrameLayout
    android:id="@+id/imageButton"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:foreground="?android:attr/selectableItemBackground" >

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/yourImageFile" />

</FrameLayout>

(이는 부모 레이아웃 내에 있어야합니다.)

final View imageButton = findViewById(R.id.imageButton);
imageButton.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View view) {
        // do whatever we wish!
    }
});


답변

사용 스타일 = “안드로이드 : borderlessButtonStyle” XML 파일입니다. Android 기본 클릭 효과가 표시됩니다.

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_launcher"
    style="?android:borderlessButtonStyle"
/>


답변

ImageButton을 사용하기 만하면 됩니다.


답변

이를 해결하는 간단한 방법은 다음과 같습니다.

ImageView iv = (ImageView) findViewById(R.id.imageView);

iv.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        //Agrega porcentajes de cada fraccion de grafica pastel

        Animation animFadein = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.fade_in);

        iv.startAnimation(animFadein);
    });

파일 res/anim/fade_in.xml:

<?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
         android:fillAfter="true" >

<alpha
    android:duration="100"
    android:fromAlpha="0.0"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:toAlpha="1.0" />
 </set>