實現點擊圖片(ImageView)變暗效果,有一個較簡單的方法,就是講目標圖片設置為背景圖片(setBackground),再創建一個selector.xml文件,里面放置一張普通狀態時的透明圖片,一張點擊狀態下的棕色半透明圖片,將其設置為ImageView的源圖片。這樣在點擊ImageView時,源圖片會變換透明度,達到變暗效果。但這種方法有個缺點:由於源圖片已經被限制死了,假如我們需要自定義背景圖片,將目標圖片放置在背景圖片上,就無法實現了。這里介紹一種通過濾鏡和監聽onTouchEvent事件來達到變暗效果的方法。
源碼如下:
import android.content.Context; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ImageView; /** * @ClassName: ThumbnailView * @Description: 點擊時顯示明暗變化(濾鏡效果)的ImageView * @author LinJ * @date 2015-1-6 下午2:13:46 * */ public class ThumbnailView extends ImageView{ public ThumbnailView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: //在按下事件中設置濾鏡 setFilter(); break; case MotionEvent.ACTION_UP: //由於捕獲了Touch事件,需要手動觸發Click事件 performClick(); case MotionEvent.ACTION_CANCEL: //在CANCEL和UP事件中清除濾鏡 removeFilter(); break; default: break; } return true; } /** * 設置濾鏡 */ private void setFilter() { //先獲取設置的src圖片 Drawable drawable=getDrawable(); //當src圖片為Null,獲取背景圖片 if (drawable==null) { drawable=getBackground(); } if(drawable!=null){ //設置濾鏡 drawable.setColorFilter(Color.GRAY,PorterDuff.Mode.MULTIPLY);; } } /** * 清除濾鏡 */ private void removeFilter() { //先獲取設置的src圖片 Drawable drawable=getDrawable(); //當src圖片為Null,獲取背景圖片 if (drawable==null) { drawable=getBackground(); } if(drawable!=null){ //清除濾鏡 drawable.clearColorFilter(); } } }
通過監聽Down事件設置濾鏡,監聽Up和Cancel事件去掉濾鏡,以此達到圖片變暗效果。但是這個方法也有個很麻煩的缺點:由於攔截了Touch事件,會導致onClick和onLongClick事件還有其他很多事件都無法正常觸發,如上述代碼所示需要手動觸發Click事件。當該View是作為ListView的內部View時,情況將更加麻煩,因此要慎用,在需要復雜交互的情況下最好別用這種方法。
修改添加長按事件:
package com.linj.camera.view; import android.content.Context; import android.graphics.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.GestureDetector; import android.view.MotionEvent; import android.widget.ImageView; /** * @ClassName: FilterImageView * @Description: 點擊時顯示明暗變化(濾鏡效果)的ImageView * @author LinJ * @date 2015-1-6 下午2:13:46 * */ public class FilterImageView extends ImageView implements GestureDetector.OnGestureListener{ /** 監聽手勢*/ private GestureDetector mGestureDetector; public FilterImageView(Context context, AttributeSet attrs) { super(context, attrs); mGestureDetector=new GestureDetector(context, this); } @Override public boolean onTouchEvent(MotionEvent event) { //在cancel里將濾鏡取消,注意不要捕獲cacncel事件,mGestureDetector里有對cancel的捕獲操作 //在滑動GridView時,AbsListView會攔截掉Move和UP事件,直接給子控件返回Cancel if(event.getActionMasked()== MotionEvent.ACTION_CANCEL){ removeFilter(); } return mGestureDetector.onTouchEvent(event); } /** * 設置濾鏡 */ private void setFilter() { //先獲取設置的src圖片 Drawable drawable=getDrawable(); //當src圖片為Null,獲取背景圖片 if (drawable==null) { drawable=getBackground(); } if(drawable!=null){ //設置濾鏡 drawable.setColorFilter(Color.GRAY,PorterDuff.Mode.MULTIPLY);; } } /** * 清除濾鏡 */ private void removeFilter() { //先獲取設置的src圖片 Drawable drawable=getDrawable(); //當src圖片為Null,獲取背景圖片 if (drawable==null) { drawable=getBackground(); } if(drawable!=null){ //清除濾鏡 drawable.clearColorFilter(); } } @Override public boolean onDown(MotionEvent e) { setFilter(); //這里必須返回true,表示捕獲本次touch事件 return true; } @Override public void onShowPress(MotionEvent e) { // TODO Auto-generated method stub } @Override public boolean onSingleTapUp(MotionEvent e) { removeFilter(); performClick(); return false; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // TODO Auto-generated method stub return false; } @Override public void onLongPress(MotionEvent e) { //長安時,手動觸發長安事件 performLongClick(); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub return false; } }
