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;
}
}
Android:通过滤镜实现点击图片变暗效果的更多相关文章
- Android 仿微信朋友圈点击图片变暗
package cn.eoe.leigo.view; import android.content.Context; import android.graphics.Bitmap; import an ...
- Android的GridView控件点击图片变暗效果
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setC ...
- Android 实现九宫格、点击图片放大全屏浏览等
项目GitHub地址https://github.com/tikeyc/TNinePlaceGridView_Android https://github.com/tikeyc/TikeycAndro ...
- Android 自定义 ViewPager 打造千变万化的图片切换效果
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38026503 记得第一次见到ViewPager这个控件,瞬间爱不释手,做东西的主 ...
- Android 轮播图Banner切换图片的效果
Android XBanner使用详解 2018年03月14日 08:19:59 AND_Devil 阅读数:910 版权声明:本文为博主原创文章,未经博主允许不得转载. https://www. ...
- Android ImageButton | Button | TextView 点击和触摸效果
ImageButton------------------------------------------------> 一.Java 代码: 在drawable目录下添加新的xml文件 bu ...
- [Android] PorterDuff使用实例----实现新浪微博图片下载效果
先上效果图,如demo_sinaweibo.gif 由效果图,下半部分是简单的效果叠加,上半部分是新浪微博加载图片显示进度的效果,显示进度的半透明区域只与根据背景图的非透明区域叠加,背景图的透明区域仍 ...
- android View实现变暗效果
android项目中做一个默认图片变暗,有焦点时变亮的效果.相信大家都能各种办法,各种手段很容易的实现这个效果.这里记录下作者实现这个效果的过程及遇到的问题,仅供参考.见下图(注:因为是eclipse ...
- Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38140505 自从Gallery被谷歌废弃以后,Google推荐使用ViewPa ...
随机推荐
- python脚本3_输入若干个整数打印出最大值
#输入若干个整数,打印出最大值 # m = int(input('Input first number >>>')) while True: c = input('Input a n ...
- 委托,lambda,匿名方法
lambda表达式其实就是匿名方法的变体或者说简写. 原来我们用 delegate void Del(int x); Del d = delegate(int x) { return x + 1; } ...
- LCS 的 NlogN作法
这个算法其实是因为LIS有NlogN的作法,把LCS转化为了LIS来做. 对于序列A{},B{},我们可以记录下来B中的每个元素在A中出现的位置,按顺序保存在一个新序列当中, 如果有多个位置按倒序写, ...
- Flexible实现H5页面的rem布局适配
1.https://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html (使用Flexible实现手淘H5页面的终端适配) 2.http ...
- CocoaPods使用事项
本人整理转载自 :Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 1CocoaPods是什么? 当你 ...
- dga2
0e527eaf_5ec5_4623_9fe9_e459583acd72.com0fmgm1cuu7h1279dghgka0ltg.com0ydlanpuh4e2wl9h6udk6.com10uz8k ...
- day5-configparser模块
一.概述 在软件开发过程中,很多时候需要处理配置文件的读取解析和改写,在python中专门处理配置文件的模块就是configpaser了.顾名思义,configpaser就是配置解析器,可用来对符合格 ...
- react use simditor
1.install simditor 2.import simditor && scss import $ from "jquery" import Simdito ...
- react-redux: counter
store: import {createStore,applyMiddleware, compose} from "redux"; import thunk from " ...
- selenium webdriver入门
写在前面:最近在研究UI自动化测试的过程中,发现公司里通常用的是AutomanX框架,而这个框架实际上是基于selenium webdriver框架的,所以在编写测试用例时,很多语法都是直接使用sel ...