Android:通過濾鏡實現點擊圖片變暗效果


實現點擊圖片(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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM