最近项目上要求在listview上实现类似ios 3dTouch功能,现在网上搜索一番,发现该文章很好的实现了这个功能,于是在这文章的基础上我自己做了一个改进。效果如图所示:

   

实现思路:

1.截取图片

 // 获取屏幕照片public static Bitmap captureScreen(Activity activity) {activity.getWindow().getDecorView().setDrawingCacheEnabled(true);Bitmap bmp = activity.getWindow().getDecorView().getDrawingCache();return bmp;}

2.做高斯模糊处理

 // 高斯模糊处理private Bitmap blur(Bitmap bitmap, float radius) {Bitmap output = Bitmap.createBitmap(bitmap); // 创建输出图片RenderScript rs = RenderScript.create(this); // 构建一个RenderScript对象ScriptIntrinsicBlur gaussianBlue = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); //// 创建高斯模糊脚本Allocation allIn = Allocation.createFromBitmap(rs, bitmap); // 开辟输入内存Allocation allOut = Allocation.createFromBitmap(rs, output); // 开辟输出内存gaussianBlue.setRadius(radius); // 设置模糊半径,范围0f<radius<=25fgaussianBlue.setInput(allIn); // 设置输入内存gaussianBlue.forEach(allOut); // 模糊编码,并将内存填入输出内存allOut.copyTo(output); // 将输出内存编码为Bitmap,图片大小必须注意rs.destroy(); // 关闭RenderScript对象,API>=23则使用rs.releaseAllContexts()return output;}

3.按压实现动态高斯模糊
思路:布局的时候下面一张高斯模糊的图片,上面高斯模糊的图片,对上面的图片进行动态透明度变化,这时候看效果就是动态高斯模糊了
4.在按压位置出现一个新的控件浮在上面
思路:动态添加view,通过计算点击位置获取listview的item位置,给该view设置setMargins控制其位置
5.优化
代码:

xml文件

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/root"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/test_list"android:layout_width="match_parent"android:layout_height="match_parent"></ListView><ImageViewandroid:id="@+id/image_down"android:layout_width="match_parent"android:layout_height="match_parent"/><ImageViewandroid:id="@+id/image_up"android:layout_width="match_parent"android:layout_height="match_parent"/><TextViewandroid:id="@+id/item_tv_ss"android:layout_width="match_parent"android:layout_height="50dp"android:textSize="30sp"android:background="#ffffff"/>
</RelativeLayout>

Activity文件

package memorandum.ios.csc.com.memorandum.activity;import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import memorandum.ios.csc.com.memorandum.R;/*** Created by csc on 17-7-31.*/
public class TestActivity extends Activity{private ListView testListView;private List<Map<String, String>> data;private ImageView imageUp, imageDown;private Bitmap sampleImg;private Bitmap gaussianBlurImg;private int count = 0;private View attachedView;private RelativeLayout rootRl;private TextView testTv;RelativeLayout.LayoutParams lp;private boolean is3DTouch = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//取消标题栏requestWindowFeature(Window.FEATURE_NO_TITLE);//取消状态栏getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.test);initData();imageUp = (ImageView) findViewById(R.id.image_up);imageDown = (ImageView) findViewById(R.id.image_down);testListView = (ListView) findViewById(R.id.test_list);testListView.setAdapter(new SimpleAdapter(this, data, R.layout.listview_item, new String[]{"name"},new int[]{R.id.item_tv}));attachedView = View.inflate(this,R.layout.listview_item,null);rootRl = (RelativeLayout) findViewById(R.id.root);testTv = (TextView)findViewById(R.id.item_tv_ss);lp = new RelativeLayout.LayoutParams(testTv.getLayoutParams());testListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {count = 0;sampleImg = captureScreen(TestActivity.this);imageUp.setVisibility(View.VISIBLE);imageDown.setVisibility(View.VISIBLE);imageUp.setImageBitmap(sampleImg);gaussianBlurImg = blur(sampleImg, 25f);// 高斯模糊图片imageDown.setImageBitmap(gaussianBlurImg);imageUp.setImageAlpha(255);HashMap item = (HashMap)testListView.getItemAtPosition(i);String section =String.valueOf(item.get("name").toString());//get每一行的数据的名字testTv.setText(section);int[] location = new int[2] ;testListView.getChildAt(i-testListView.getFirstVisiblePosition()).getLocationOnScreen(location);lp.setMargins(0, location[1], 0, 0);testTv.setLayoutParams(lp);testTv.setVisibility(View.VISIBLE);is3DTouch = true;return false;}});testListView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent) {switch (motionEvent.getAction()) {case MotionEvent.ACTION_DOWN:break;case MotionEvent.ACTION_MOVE:if(is3DTouch){if (count < 255)count = count + 8;int alpha = 255 - count;if (alpha < 0)alpha = 0;imageUp.setImageAlpha(alpha);}break;case MotionEvent.ACTION_UP:if(is3DTouch){imageUp.setImageAlpha(255);testTv.setVisibility(View.GONE);imageUp.setVisibility(View.GONE);imageDown.setVisibility(View.GONE);is3DTouch = false;}break;}return false;}});}private void initData() {data = new ArrayList<Map<String, String>>();for (int i = 0; i < 20; i++) {Map<String, String> map = new HashMap<String, String>();map.put("name", "BYXD" + i);data.add(map);}}// 高斯模糊处理private Bitmap blur(Bitmap bitmap, float radius) {Bitmap output = Bitmap.createBitmap(bitmap); // 创建输出图片RenderScript rs = RenderScript.create(this); // 构建一个RenderScript对象ScriptIntrinsicBlur gaussianBlue = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); //// 创建高斯模糊脚本Allocation allIn = Allocation.createFromBitmap(rs, bitmap); // 开辟输入内存Allocation allOut = Allocation.createFromBitmap(rs, output); // 开辟输出内存gaussianBlue.setRadius(radius); // 设置模糊半径,范围0f<radius<=25fgaussianBlue.setInput(allIn); // 设置输入内存gaussianBlue.forEach(allOut); // 模糊编码,并将内存填入输出内存allOut.copyTo(output); // 将输出内存编码为Bitmap,图片大小必须注意rs.destroy(); // 关闭RenderScript对象,API>=23则使用rs.releaseAllContexts()return output;}// 获取屏幕照片public static Bitmap captureScreen(Activity activity) {activity.getWindow().getDecorView().setDrawingCacheEnabled(true);Bitmap bmp = activity.getWindow().getDecorView().getDrawingCache();return bmp;}}

到这里就实现了listview动态高斯模糊效果了。接下来对代码进行优化,将效果调到iphone通讯录那样,在该效果后面加个popupmenu,这个有空贴代码。

android listview仿ios 3dTouch效果相关推荐

  1. android listview仿iphone通讯录ios 3dTouch

    接上篇android listview仿ios 3dTouch效果,对代码进行整合进类似ios通讯录里面,效果图如下:     . 效果如上,在上篇的内容后面跳出电话信息. popmenu布局文件代码 ...

  2. android 按钮回弹效果,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

  3. android 布局回弹,Android仿IOS回弹效果 支持任何控件

    本文实例为大家分享了Android仿IOS回弹效果的具体代码,供大家参考,具体内容如下 效果图: 导入依赖: dependencies { // ... compile 'me.everything: ...

  4. android菊花动画,Android实现仿iOS菊花加载圈动画效果

    常见的实现方式 切图,做旋转动画 自定义View,绘制效果 gif图 1.切图会增加体积,但相对简单,不过在换肤的场景下,会使用不同颜色,需要准备多张图,不够灵活. 2.由于自定义的好处,不同颜色只需 ...

  5. [纪录]仿IOS滚轮效果(竖直滑动选择器)

    今天想做一个类似这样的一个效果,可是UI的模板是参考IOS做的,于是就各种百度各种搜,最后让我找到了一个仿IOS滚轮的一个Demo,稍微研究了一下,发上来,大家一起学习,以后也方便我查看,就不用再去百 ...

  6. Android高仿iOS Messages录音操作按钮

    Android高仿iOS Messages录音操作按钮 目录 一.目标 二.功能分析 三.实现效果 四.实现过程 五.开发过程回顾 六.接下来 七.Finally 前面的2次开发,分别完成了实现录音和 ...

  7. Android安卓仿IOS音量调节-自定义view系列(4)

    Android安卓仿IOS音量调节-自定义view系列 功能简介 主要实现步骤 xml相关属性设置 java代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击查看 Gi ...

  8. Android高仿iOS Messages聊天气泡

    Android高仿iOS Messages聊天气泡 一.目标 二.功能分析 三.实现代码 1. ChatItem 2. DateItem 3. TextItem 4. PhotoItem 5. Cha ...

  9. Android—ListView Item 展开动画效果

    Android-ListView Item 展开动画效果 最近在做一个关于ListView item的展开效果,类似于 "粮仓" App 的商店页面,点击Item,展开显示子Vie ...

最新文章

  1. 中文TTS文字转语音合成模块合成成品带喇叭 替代SYN6288和XFS5152
  2. javaSE基础——常见的dos命令即其他
  3. 数据结构思维 第三章 `ArrayList`
  4. WebSocket请求过程分析及实现Web聊天室
  5. 即刻起,加速您的前端构建
  6. FPGA-小梅哥时序约束
  7. 领英给好友群发消息的方法和细节
  8. C语言: 编写程序,输出所有的水仙花数
  9. rest接口访问webService soap接口 用XStream javabean和xml的互转
  10. ORA-01274: cannot add datafile '/oradata/orauat/tbs_captain01.dbf'
  11. 【雕爷学编程】Arduino动手做(64)---RGB全彩LED模块
  12. 推荐系统(3)—基于标签的推荐系统(Python)
  13. 论程序员写不出代码怎么办
  14. 获取二叉树叶子节点个数的递归及非递归算法
  15. vba mysql查询数组中_VBA中典型的查询数据库及相关命令代码 | 雷雨博客
  16. SOFA Weekly|MOSN v1.3.0 版本发布、公众号半自助投稿、本周 Contributor QA
  17. 【ZED】从零开始使用ZED相机(五):Opencv+Python实现相机标定(双目)
  18. 自相矛盾的俗语及名言
  19. (转)Android刷机的一些知识整理
  20. js 正则表达式中的特殊字符

热门文章

  1. 工作经验这样写,面试就有了!
  2. PDF如何裁剪页面,PDF裁剪页面的方法
  3. java丶对数组值按首字母进行排序
  4. matlab ode45修改,matlab ode45增加输入值
  5. 2021北航计算机考研人数,惊了!2021考研人数422万?!淘汰率或超过70%?8所高校报考人数汇总...
  6. JavaScript 三座大山
  7. 使用adb.exe禁止安卓手机app震动权限
  8. Python使用opencv实现图片定位第三种方式
  9. linux系统top命令:virt,res,shr详解
  10. mysql where in()