मेरे एंड्रॉइड ऐप में मेरे पास इमेजव्यू है जिसे मैं दिए गए ऑनक्लिक इवेंट के बटन की तरह इस्तेमाल कर रहा हूं, लेकिन जैसा कि आप अनुमान लगा सकते हैं कि क्लिक करने पर यह इमेजव्यू को क्लिक करने योग्य प्रभाव नहीं दे रहा है। मैं उसे कैसे प्राप्त कर सकता हूं?
जवाबों:
आप क्लिक किए गए राज्यों / क्लिक नहीं किए गए राज्यों के लिए अलग-अलग चित्र डिज़ाइन कर सकते हैं और उन्हें निम्न प्रकार से सेट कर सकते हैं
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;
}
});
MotionEvent.ACTION_DOWN || MotionEvent.ACTION_MOVE
जब तक हम दबा रहे हैं, तब तक छवि को दिखाने के लिए बेहतर होगा ।
setOnTouchListener(...
। आप बस <selector ...>
XML बना सकते हैं और फिर ImageView क्लिक करने योग्य को XML में सेट कर सकते हैं जैसे<ImageView ... android:clickable="true" android:focusable="true" android:src="@drawable/my_selector" />
आप कुछ इस तरह का उपयोग करके एक ही छवि के साथ कर सकते हैं:
//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 (या ImageButton के उपवर्ग में बना रहा हूँ क्योंकि यह आसान पुन: प्रयोज्य के लिए ImageView का एक उपवर्ग भी है), लेकिन इससे आपको एक छवि के लिए "चयनित" लुक लागू करने की अनुमति मिल सकती है।
false
, अन्यथा दृश्य की वास्तविक onClick()
घटना को निकाल नहीं दिया जाएगा
ColorFilter विधि का उपयोग करके केवल एक छवि फ़ाइल के साथ करना संभव है । हालाँकि, ColorFilter ImageViews के साथ काम करने की उम्मीद करता है न कि बटन के साथ, इसलिए आपको अपने बटन को ImageViews में बदलना होगा। यह एक समस्या नहीं है यदि आप वैसे भी अपने बटनों के रूप में छवियों का उपयोग कर रहे हैं, लेकिन यह अधिक कष्टप्रद है यदि आपके पास पाठ था ... वैसे भी, आपको लगता है कि पाठ के साथ समस्या का एक रास्ता मिल गया है, यहां उपयोग करने के लिए कोड है:
ImageView button = (ImageView) findViewById(R.id.button);
button.setColorFilter(0xFFFF0000, PorterDuff.Mode.MULTIPLY);
यह बटन पर एक लाल ओवरले लागू करता है (रंग कोड पूरी तरह से अपारदर्शी लाल के लिए हेक्स कोड है - पहले दो अंक पारदर्शिता हैं, फिर यह आरआर जीजी बीबी है।)।
EDIT : यद्यपि नीचे दिया गया मूल उत्तर काम करता है और स्थापित करना आसान है, इस पोस्ट को Google पर एक एंड्रॉइड डेवलपर एडवोकेट द्वारा संदर्भित करें यदि आप चाहते हैं / अधिक कुशल कार्यान्वयन की आवश्यकता है। यह भी ध्यान दें कि यह android:foreground
विशेषता Android M में डिफ़ॉल्ट रूप से ImageView सहित सभी दृश्यों पर आ रही है।
एक ImageView के लिए चयनकर्ता का उपयोग करने में समस्या यह है कि आप इसे केवल दृश्य की पृष्ठभूमि के रूप में सेट कर सकते हैं - जब तक आपकी छवि अपारदर्शी है, तब तक आपको इसके पीछे चयनकर्ता का प्रभाव नहीं दिखाई देगा।
ट्रिक फ्रेमवर्क में अपने ImageView को उस विशेषता के साथ लपेटने के लिए है android:foreground
जो हमें इसकी सामग्री के लिए एक ओवरले को परिभाषित करने की अनुमति देता है। यदि हम android:foreground
एक चयनकर्ता (उदाहरण के ?android:attr/selectableItemBackground
लिए एपीआई स्तर 11+ के लिए) पर सेट होते हैं और OnClickListener
ImageView के बजाय फ़्रेमलैटआउट के साथ संलग्न करते हैं , तो छवि हमारे चयनकर्ता के ड्रॉबल के साथ ओवरलेड हो जाएगी - क्लिक प्रभाव हम चाहते हैं!
देखो:
<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!
}
});
selectableItemBackground
विशेषता केवल API स्तर 11 में जोड़ी गई थी, इसलिए यदि आप पुराने API स्तरों के लिए इस समाधान का उपयोग करना चाहते हैं, तो आपको किसी अन्य चयनकर्ता का उपयोग करना होगा। उदाहरण के लिए, मेरे एक एप्लिकेशन के लिए जो एपीआई स्तर 7 का समर्थन करता है, मैं एंड्रॉइड होलो कलर्स जेनरेटर टूल@drawable/list_selector_holo_light
का उपयोग करके उत्पन्न संसाधन का उपयोग करता हूं ।
<ImageButton>
चयन करके एक ही व्यवहार प्राप्त कर सकते हैं ।
उपयोग शैली = "एंड्रॉयड: borderlessButtonStyle" एक्सएमएल फ़ाइल में। यह Android डिफ़ॉल्ट क्लिक प्रभाव दिखाएगा।
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
style="?android:borderlessButtonStyle"
/>
android:adjustViewBounds="true"
पैडिंग को अनसेट करना है।
style="?android:attr/borderlessButtonStyle"
: developer.android.com/guide/topics/ui/controls/…
बस एक 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>
ImageView के लिए चयन करने योग्य पृष्ठभूमि सेट करें और कुछ गद्दी जोड़ें। फिर संलग्न करें OnClickListener
।
<ImageView
android:id="@+id/your_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/your_image"
android:padding="10dp"
android:background="?android:attr/selectableItemBackground"/>
चयनकर्ता को ड्रा करने योग्य विकल्प को परिभाषित करने के लिए
<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>
मुझे एंड्रॉइड का उपयोग करना है: android के बजाय State_pressed: state_selected
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed ="true"
android:drawable="@drawable/img_down" />
<item android:state_pressed ="false"
android:drawable="@drawable/img_up" />
</selector>
आप android:background="@android:drawable/list_selector_background"
डिफ़ॉल्ट "अलार्म घड़ी" (अब डेस्क घड़ी) में "अलार्म जोड़ें" के समान प्रभाव प्राप्त करने की कोशिश कर सकते हैं।
यदि आप टैप करते समय लहर चाहते हैं, तो यह इस कोड द्वारा दिया जा सकता है:
<ImageView
...
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
...
</ImageView>
इसी तरह, आप TextView के लिए क्लिक प्रभाव लागू कर सकते हैं
<TextView
...
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
...
</TextView>
यह मेरे लिए काम किया:
img.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
{
((ImageView)v).setImageAlpha(200);
break;
}
case MotionEvent.ACTION_MOVE:
{
// if inside bounds
if(event.getX() > 0 && event.getX() < v.getWidth() && event.getY() > 0 && event.getY() < v.getHeight())
{
((ImageView)v).setImageAlpha(200);
}
else
{
((ImageView)v).setImageAlpha(255);
}
break;
}
case MotionEvent.ACTION_UP:
{
((ImageView)v).setImageAlpha(255);
}
}
return true;
}
});
@ ईडिट: जैसा कि गुहान ने कहा कि सेटआईमैजएलएलपीए पद्धति के साथ बैकवर्ड कम्पेटिबिलिटी की समस्या होगी। मैंने इस विधि का उपयोग किया है:
public static void setImageAlpha(ImageView img, int alpha)
{
if(Build.VERSION.SDK_INT > 15)
{
img.setImageAlpha(alpha);
}
else
{
img.setAlpha(alpha);
}
}
मैं कुछ ऐसी ही चीजें करता हूं जो आपके लिए उपयुक्त हैं या नहीं
प्रेस प्रभाव हेल्पर देखें:
उपयोग: आईओएस की तरह कुछ सरल प्रेस प्रभाव करते हैं
सरल उपयोग:
ImageView img = (ImageView) findViewById (R.id.img);
ऊपर दिए गए सभी उत्तरों के संयोजन में, मैं चाहता था कि ImageView दबाया जाए और राज्य को बदल दिया जाए, लेकिन यदि उपयोगकर्ता स्थानांतरित हो गया तो "रद्द करें" और ऑनक्लीस्टलिस्टर न करें।
मैंने कक्षा के भीतर एक पॉइंट ऑब्जेक्ट बनाने और उपयोगकर्ता के ImageView पर नीचे धकेल दिए जाने के अनुसार अपने निर्देशांक सेट करने का काम किया। MotionEvent.ACTION_UP पर मैं एक नया बिंदु रिकॉर्ड कर रहा हूं और अंकों की तुलना करता हूं।
मैं केवल इसे इतनी अच्छी तरह से समझा सकता हूं, लेकिन यहां मैंने वही किया है।
// set the ontouch listener
weatherView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// Determine what action with a switch statement
switch (event.getAction()) {
// User presses down on the ImageView, record the original point
// and set the color filter
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();
p = new Point((int) event.getX(), (int) event.getY());
break;
}
// Once the user releases, record new point then compare the
// difference, if within a certain range perform onCLick
// and or otherwise clear the color filter
case MotionEvent.ACTION_UP: {
ImageView view = (ImageView) v;
Point f = new Point((int) event.getX(), (int) event.getY());
if ((Math.abs(f.x - p.x) < 15)
&& ((Math.abs(f.x - p.x) < 15))) {
view.performClick();
}
// clear the overlay
view.getDrawable().clearColorFilter();
view.invalidate();
break;
}
}
return true;
}
});
मेरे पास छवि दृश्य पर एक onClickListener सेट है, लेकिन यह एक तरीका हो सकता है।
MotionEvent.ACTION_CANCEL
उसी कार्यक्षमता के साथ मामला जोड़कर MotionEvent.ACTION_UP
तब दृश्य को "साफ़" करना संभव है यदि उपयोगकर्ता एक "ड्रैग" करता है जो एक क्लिक क्रिया नहीं है।
आप setPressed
OnTouchEvent श्रोताओं को बनाने के बजाय ImageView में ओवरराइड कर सकते हैं और वहां कलर फिल्टरिंग कर सकते हैं:
@Override
public void setPressed(boolean pressed) {
super.setPressed(pressed);
if(getDrawable() == null)
return;
if(pressed) {
getDrawable().setColorFilter(0x44000000, PorterDuff.Mode.SRC_ATOP);
invalidate();
}
else {
getDrawable().clearColorFilter();
invalidate();
}
}
श्री ज़ोर्न के उत्तर के आधार पर , मैं अपने सार उपयोगिता वर्ग में एक स्थिर विधि का उपयोग करता हूं:
public abstract class Utility {
...
public static View.OnTouchListener imgPress(){
return imgPress(0x77eeddff); //DEFAULT color
}
public static View.OnTouchListener imgPress(final int color){
return new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN: {
ImageView view = (ImageView) v;
view.getDrawable().setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
view.invalidate();
break;
}
case MotionEvent.ACTION_UP:
v.performClick();
case MotionEvent.ACTION_CANCEL: {
ImageView view = (ImageView) v;
//Clear the overlay
view.getDrawable().clearColorFilter();
view.invalidate();
break;
}
}
return true;
}
};
}
...
}
तो मैं इसे onTouchListener के साथ उपयोग करता हूं:
ImageView img=(ImageView) view.findViewById(R.id.image);
img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) { /* Your click action */ }
});
img_zc.setOnTouchListener(Utility.imgPress()); //Or Utility.imgPress(int_color_with_alpha)
यदि आपके पास बहुत सारी छवियां हैं, तो यह बहुत सरल है, और आप बिना किसी एक्सएमएल ड्राबल और केवल एक छवि के बिना एक साधारण ऑनटच प्रभाव चाहते हैं।
एक का उपयोग करें android.widget.Button
, और background
एक के लिए अपनी संपत्ति सेट करें android.graphics.drawable.StateListDrawable
। यह सब XML में या प्रोग्रामेटिक रूप से किया जा सकता है। फॉर्म स्टफ ट्यूटोरियल का कस्टम बटन अनुभाग देखें ।
मैं नमूना बनाने के यहाँ , में सिर्फ परिवर्तन imageView ClickableImageView अपने लेआउट से। आशा है कि यह मदद करेगा।
मुझे लगता है कि ImageButton एक बेहतर समाधान है
<ImageButton
android:layout_width="96dp"
android:layout_height="56dp"
android:src="@mipmap/ic_launcher"
android:adjustViewBounds="true"
android:background="@android:color/transparent"
android:foreground="@drawable/selector" />
यदि आप पृष्ठभूमि छवियों का उपयोग करते हैं तो मेरे पास एक और सौंदर्य समाधान है :)
public static void blackButton(View button){
button.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: {
v.getBackground().setColorFilter(0xf0f47521,PorterDuff.Mode.SRC_ATOP);
v.invalidate();
break;
}
case MotionEvent.ACTION_UP: {
v.getBackground().clearColorFilter();
v.invalidate();
break;
}
}
return false;
}
});
}
या:
आप इस फॉर्म का उपयोग कर सकते हैं, इमेज बटन के साथ।
फ़ाइल बनाएँ res/drawable/btn_video.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/image"
android:state_pressed="true" />
<item android:drawable="@drawable/ico2"
android:state_focused="true" />
<item android:drawable="@drawable/ico2" />
</selector>
और res/layout/activity_main.xml
:
<ImageButton
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageButton"
android:layout_gravity="center_horizontal"
android:onClick="eventImageBtn"
android:background="@drawable/btn_video"
android:adjustViewBounds="true"
android:scaleType="fitXY"
/>
आपकी छवि एक क्लिक से बदल जाती है, और आप एक रेखीय लेआउट के साथ समायोजित कर सकते हैं:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/menu_item_background">
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"
android:paddingLeft="@dimen/main_screen_side_padding" android:paddingRight="@dimen/main_screen_side_padding" android:paddingTop="@dimen/main_screen_side_padding" android:paddingBottom="@dimen/main_screen_side_padding"
android:background="#ffb3ff13" android:weightSum="10.00">
<LinearLayout android:layout_weight="2.50" android:background="#ff56cfcd" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="0dp" >
<ImageButton
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageButton"
android:layout_gravity="center_horizontal"
android:onClick="eventImageBtn"
android:background="@drawable/btn_video"
android:adjustViewBounds="true"
android:scaleType="fitXY"
/>
</LinearLayout>
<LinearLayout android:layout_weight="0.50" android:layout_height="0dp" android:background="#ffffffff" android:orientation="vertical" android:layout_width="fill_parent" >
</LinearLayout>
<LinearLayout android:layout_weight="4.50" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="0dp" android:background="#ff8aa5ff">
</LinearLayout>
<LinearLayout android:layout_weight="0.50" android:layout_height="0dp" android:background="#ffffffff" android:orientation="vertical" android:layout_width="fill_parent" >
</LinearLayout>
<LinearLayout android:layout_weight="2.00" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="0dp" android:background="#ffff7d1a" >
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
यहां मेरा समाधान है, जो " नौऑल्डअंडरॉयड्स " लाइब्रेरी का उपयोग करते हुए , पुराने एपीआई का भी समर्थन करता है:
rootView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(final View v, final MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
v.setBackgroundResource(R.drawable.listview_normal);
ViewHelper.setAlpha(imageView, 1);
break;
case MotionEvent.ACTION_DOWN:
v.setBackgroundResource(0);
v.setBackgroundColor(getResources().getColor(R.color.listview_pressed));
ViewHelper.setAlpha(imageView, 0.75f);
break;
}
return false;
}
});
यह मानता है कि rootView स्वयं सेल (लेआउट) है, और इसमें एक ही छवि दृश्य है जिसे आप उस रंग से प्रभावित करना चाहते हैं जिसे आप पूरे सेल पर लागू करना चाहते हैं।
संपादित करें: यदि आप चाहें, तो आप अग्रभूमि को संभालने के लिए ImageView का विस्तार भी कर सकते हैं, और इसे "? Android: attr / selectableItemBackground" पर सेट कर सकते हैं। यहाँ इसके लिए एक पुस्तकालय है और आप इसे यहाँ कैसे भी देख सकते हैं, इसके लिए एक ट्यूटोरियल है ।
इस धागे पर मदद के लिए धन्यवाद। हालाँकि, आप एक चीज़ से चूक गए ... आपको ACTION_CANCEL को भी संभालना होगा। यदि आप ऐसा नहीं करते हैं, तो आप उस घटना में ImageView के अल्फा मान को ठीक से पुनर्स्थापित नहीं कर सकते हैं कि दृश्य पदानुक्रम में एक माता-पिता एक स्पर्श घटना (एक स्क्रॉल दृश्य आप ImageView लपेटता है) को स्वीकार करता है।
यहाँ एक पूर्ण वर्ग है जो उपरोक्त वर्ग पर आधारित है, लेकिन साथ ही ACTION_CANCEL का भी ध्यान रखता है। यह प्री-पोस्ट जेलीबीन एपीआई में अंतर को अमूर्त करने के लिए एक ImageViewCompat सहायक वर्ग का उपयोग करता है।
public class ChangeAlphaOnPressedTouchListener implements OnTouchListener {
private final float pressedAlpha;
public ChangeAlphaOnPressedTouchListener(float pressedAlpha) {
this.pressedAlpha = pressedAlpha;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView iv = (ImageView) v;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
ImageViewCompat.setAlpha(iv, pressedAlpha);
break;
case MotionEvent.ACTION_MOVE:
if (isInsideViewBounds(v, event)) {
ImageViewCompat.setAlpha(iv, pressedAlpha);
} else {
ImageViewCompat.setAlpha(iv, 1f);
}
break;
case MotionEvent.ACTION_UP:
ImageViewCompat.setAlpha(iv, 1f);
break;
case MotionEvent.ACTION_CANCEL:
ImageViewCompat.setAlpha(iv, 1f);
}
return false;
}
private static boolean isInsideViewBounds(View v, MotionEvent event) {
return event.getX() > 0 && event.getX() < v.getWidth() && event.getY() > 0
&& event.getY() < v.getHeight();
}
}
यहाँ मेरा कोड है विचार यह है कि जब उपयोगकर्ता इसे छूता है तो ImageView को रंगीन फ़िल्टर मिलता है, और उपयोगकर्ता द्वारा इसे छूने से रोकने पर रंग फ़िल्टर हटा दिया जाता है।
मार्टिन बुका वेसर, एंड्रस, आह लाम, ऑल्टोश, सॉल्यूशन काम नहीं करता है जब ImageView ने भी ऑनक्लाइक किया है। worawee.s और kcoppock (ImageButton के साथ) समाधान के लिए पृष्ठभूमि की आवश्यकता होती है, जिसका कोई मतलब नहीं है जब ImageView पारदर्शी नहीं है।
यह रंग फिल्टर के बारे में AZ_ विचार का विस्तार है ।
class PressedEffectStateListDrawable extends StateListDrawable {
private int selectionColor;
public PressedEffectStateListDrawable(Drawable drawable, int selectionColor) {
super();
this.selectionColor = selectionColor;
addState(new int[] { android.R.attr.state_pressed }, drawable);
addState(new int[] {}, drawable);
}
@Override
protected boolean onStateChange(int[] states) {
boolean isStatePressedInArray = false;
for (int state : states) {
if (state == android.R.attr.state_pressed) {
isStatePressedInArray = true;
}
}
if (isStatePressedInArray) {
super.setColorFilter(selectionColor, PorterDuff.Mode.MULTIPLY);
} else {
super.clearColorFilter();
}
return super.onStateChange(states);
}
@Override
public boolean isStateful() {
return true;
}
}
उपयोग:
Drawable drawable = new FastBitmapDrawable(bm);
imageView.setImageDrawable(new PressedEffectStateListDrawable(drawable, 0xFF33b5e5));
मैंने कोशिश की:
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/get_started"
android:src="@drawable/home_started"
style="?android:borderlessButtonStyle"
android:adjustViewBounds="true"
android:clickable="true"
android:elevation="5dp"
android:longClickable="true" />
और यह काम किया। कृपया लाइन पर ध्यान दें:style="?android:borderlessButtonStyle"
मुझे लगता है कि सबसे आसान तरीका एक नई XML फ़ाइल बना रहा है। इस स्थिति में, हम इसे "example.xml" ड्रा करने योग्य फ़ोल्डर में कॉल करते हैं, और अनुसरण कोड में डालते हैं:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/blue"
android:state_pressed="true" />
</selector>
लेकिन इससे पहले आपको मूल्यों में फ़ोल्डर में color.xml फ़ाइल में रंग सेट करना होगा, जैसे:
<resources>
<color name="blue">#0000FF</color>
</resources>
इसने, आपने इस तरह से नए लेआउट का उपयोग करने के लिए बस बटन / इमेजबटन सेट किया है:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/example"
/>
फिर जब आप उस छवि पर क्लिक करते हैं, तो यह रंग सेट में बदल जाएगा
<item android:drawable="@color/blue"
android:state_pressed="true" />
आप जो प्रतिक्रिया चाहते हैं ...
यह मैंने कभी देखा सबसे अच्छा समाधान है। इसके अधिक सामान्य है।
<?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>
मैं के रूप में XML में इस प्रकार था - साथ 0 गद्दी छवि और लहर के आसपास ontop छवि के:
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/my_image"
android:clickable="true"
android:focusable="true"
android:src="?android:attr/selectableItemBackground" />
अभी के लिए, हमें मटेरियल डिज़ाइन अभ्यास विकसित करना चाहिए । इस मामले में आप एक ImageView पर एक तरंग प्रभाव जोड़ सकते हैं।
बस XML विशेषता जोड़ें, Android: क्लिक करने योग्य = "सही" ...