Android开发 自定义ViewGroup 实现微信九格图功能(图片不同排布不同) 和 一种图片点击变暗效果
一、图片点击变暗效果
1、继承Imageview
2、重写OnDraw方法;判断室友点击(isPressed)如果为true则canvas。drawColor(0xARGB),经常测试如果不写透明度 就没效果;
@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas); if(isPressed()){canvas.drawColor(0xaaededed); } }
3、重写dispatchSetPressed方法;当点击状态发生变化时通知重绘
@Override protected void dispatchSetPressed(boolean pressed) {super.dispatchSetPressed(pressed); invalidate(); }
二、自定义ViewGroup实现微信九格宫功能
1、自定义view的流程onMeasure(测量)-onLayout(布局)
2、获取冲父布局传入的宽度(我写的是测量方式是EXACTLY,即布局宽度要设为match_parent,否则无发正确测量)viewH,item之间的间距margin=8,将dp转为px=margin*density + 0.5f,得到一个item的宽度onceItemW
3、根据传入的数组的长度判断有几个item,特殊的有1 张,4 张和其他张,如果为一张则item的宽高都为2*onceItemW + margin,设置imageView的scletype为fill_left,如果为4张则占两行;图片数目大于一张时item的宽高都为onceItemW,主要效果看图片
4、自定义接口,接口回调为图片添加点击事件
主要代码:
1、绑定数据
public void setBitmaps(final String[] bitmaps) {this.bitmaps = bitmaps; removeAllViews(); myList.clear(); for (int j = 0 ; j < bitmaps.length ; j ++){ClickImageView imageview = new ClickImageView(getContext()); addView(imageview); myList.add(imageview); bitmapUtils.display(imageview, bitmaps[j] , mDisplayConfig );//xUtill开源框架 imageview.setTag(j);//设置tag,为了接口回调时候使用,判断是哪张图片 imageview.setId(bitmaps[j].hashCode()); imageview.setOnClickListener(onClickListener); }invalidate(); requestLayout(); }
2、测量
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int modeW = MeasureSpec.getMode(widthMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); if (modeW == MeasureSpec.EXACTLY){//布局的宽要设为match_parentonceItemH = (width - DisplayUtil.dip2px(getContext() , 2 * margin))/3; measureW = width; viewW = measureW; }if ( bitmaps == null || bitmaps.length == 0){setMeasuredDimension(0 , 0); }else{getItemW(); setMeasuredDimension(viewW , viewH); } }
3.判断图片个数,设置相应的item宽高
public void getItemW(){int length = bitmaps.length; if (length == 1) {myList.get(0).setScaleType(ImageView.ScaleType.FIT_START); itemH = onceItemH * 2 + DisplayUtil.dip2px(getContext() ,margin); itemW = onceItemH * 2 +DisplayUtil.dip2px(getContext() ,margin); viewH = itemH; } else if (length == 2 || length == 3 ) {itemH = onceItemH; itemW = itemH; viewH = onceItemH; }else if(length == 4 || length == 5 || length == 6){itemH = onceItemH; itemW = itemH; viewH = onceItemH * 2 + DisplayUtil.dip2px(getContext() ,margin); }else if(length == 7 || length == 8 || length == 9){itemH = onceItemH; itemW = itemH; viewH = onceItemH * 3 + DisplayUtil.dip2px(getContext() ,2 * margin); } }
4、布局
@Override protected void onLayout(boolean changed, int l, int t, int r, int b) {if (bitmaps == null){return; }else {int length = bitmaps.length; if (length == 1){myList.get(0).layout(0 ,0 ,itemW , itemH); }else if(length == 2 ){myList.get(0).layout(0 ,0 ,itemW , itemH); myList.get(1).layout(itemW + itemMargin ,0 ,itemW * 2 + itemMargin , itemH); }else if (length == 3 ){myList.get(0).layout(0 ,0 ,itemW , itemH); myList.get(1).layout(itemW + itemMargin ,0 ,itemW * 2 + itemMargin , itemH); myList.get(2).layout(itemW * 2 + 2 * itemMargin ,0 ,itemW * 3 + 2 * itemMargin , itemH); }else if(length == 4 ){myList.get(0).layout(0 ,0 ,itemW , itemH); myList.get(1).layout(itemW + itemMargin ,0 ,itemW * 2 + itemMargin , itemH); myList.get(2).layout(0 ,itemW + itemMargin ,itemW , 2 * itemH + itemMargin); myList.get(3).layout(itemW + itemMargin ,itemW + itemMargin ,itemW * 2 + itemMargin , 2 * itemH + itemMargin); }else if(length == 5 ){myList.get(0).layout(0 ,0 ,itemW , itemH); myList.get(1).layout(itemW + itemMargin ,0 ,itemW * 2 + itemMargin , itemH); myList.get(2).layout(itemW * 2 + 2 * itemMargin ,0 ,itemW * 3 + 2 * itemMargin , itemH); myList.get(3).layout(0 ,itemW + itemMargin ,itemW , 2 * itemH + itemMargin); myList.get(4).layout(itemW + itemMargin ,itemW + itemMargin ,itemW * 2 + itemMargin , 2 * itemH + itemMargin); }else if(length == 6 ){myList.get(0).layout(0 ,0 ,itemW , itemH); myList.get(1).layout(itemW + itemMargin ,0 ,itemW * 2 + itemMargin , itemH); myList.get(2).layout(itemW * 2 + 2 * itemMargin ,0 ,itemW * 3 + 2 * itemMargin , itemH); myList.get(3).layout(0 ,itemW + itemMargin ,itemW , 2 * itemH + itemMargin); myList.get(4).layout(itemW + itemMargin ,itemW + itemMargin ,itemW * 2 + itemMargin , 2 * itemH + itemMargin); myList.get(5).layout(itemW * 2 + 2 * itemMargin ,itemW + itemMargin ,itemW * 3 + 2 * itemMargin , 2 * itemH + itemMargin); }else if(length == 7 ){myList.get(0).layout(0 ,0 ,itemW , itemH); myList.get(1).layout(itemW + itemMargin ,0 ,itemW * 2 + itemMargin , itemH); myList.get(2).layout(itemW * 2 + 2 * itemMargin ,0 ,itemW * 3 + 2 * itemMargin , itemH); myList.get(3).layout(0 ,itemW + itemMargin ,itemW , 2 * itemH + itemMargin); myList.get(4).layout(itemW + itemMargin ,itemW + itemMargin ,itemW * 2 + itemMargin , 2 * itemH + itemMargin); myList.get(5).layout(itemW * 2 + 2 * itemMargin ,itemW + itemMargin ,itemW * 3 + 2 * itemMargin , 2 * itemH + itemMargin); myList.get(6).layout(0 ,itemW *2 + 2 * itemMargin ,itemW , 3 * itemH + 2 * itemMargin); }else if(length == 8 ){myList.get(0).layout(0 ,0 ,itemW , itemH); myList.get(1).layout(itemW + itemMargin ,0 ,itemW * 2 + itemMargin , itemH); myList.get(2).layout(itemW * 2 + 2 * itemMargin ,0 ,itemW * 3 + 2 * itemMargin , itemH); myList.get(3).layout(0 ,itemW + itemMargin ,itemW , 2 * itemH + itemMargin); myList.get(4).layout(itemW + itemMargin ,itemW + itemMargin ,itemW * 2 + itemMargin , 2 * itemH + itemMargin); myList.get(5).layout(itemW * 2 + 2 * itemMargin ,itemW + itemMargin ,itemW * 3 + 2 * itemMargin , 2 * itemH + 2 * itemMargin); myList.get(6).layout(0 ,itemW *2 + 2 * itemMargin ,itemW , 3 * itemH + 2 * itemMargin); myList.get(7).layout(itemW + itemMargin ,itemW * 2 + 2 * itemMargin ,itemW * 2 + itemMargin , 3 * itemH + 2 * itemMargin); }else if(length == 9 ){myList.get(0).layout(0 ,0 ,itemW , itemH); myList.get(1).layout(itemW + itemMargin ,0 ,itemW * 2 + itemMargin , itemH); myList.get(2).layout(itemW * 2 + 2 * itemMargin ,0 ,itemW * 3 + 2 * itemMargin , itemH); myList.get(3).layout(0 ,itemW + itemMargin ,itemW , 2 * itemH + itemMargin); myList.get(4).layout(itemW + itemMargin ,itemW + itemMargin ,itemW * 2 + itemMargin , 2 * itemH + itemMargin); myList.get(5).layout(itemW * 2 + 2 * itemMargin ,itemW + itemMargin ,itemW * 3 + 2 * itemMargin , 2 * itemH + itemMargin); myList.get(6).layout(0 ,itemW *2 + 2 * itemMargin ,itemW , 3 * itemH + 2 * itemMargin); myList.get(7).layout(itemW + itemMargin ,itemW * 2 + 2 * itemMargin ,itemW * 2 + itemMargin , 3 * itemH + 2 * itemMargin); myList.get(8).layout(itemW * 2 + 2 * itemMargin ,itemW * 2 + 2 * itemMargin ,itemW * 3 + 2 * itemMargin , 3 * itemH + 2 * itemMargin); }}
5、接口回调
private OnClickListener onClickListener = new OnClickListener() {@Override public void onClick(View v) {if (onImageViewItemOnClickListener != null){onImageViewItemOnClickListener.onImageViewItemOnClick(v , (Integer) v.getTag()); }} }; private OnImageViewItemOnClickListener onImageViewItemOnClickListener; public void setOnImageViewItemOnClickListener(OnImageViewItemOnClickListener onImageViewItemOnClickListener){this.onImageViewItemOnClickListener = onImageViewItemOnClickListener; }public interface OnImageViewItemOnClickListener{void onImageViewItemOnClick(View view , int position); }
Android开发 自定义ViewGroup 实现微信九格图功能(图片不同排布不同) 和 一种图片点击变暗效果相关推荐
- android自定义省略号,Android开发自定义TextView省略号样式的方法
本文实例讲述了Android开发自定义TextView省略号样式的方法.分享给大家供大家参考,具体如下: 在布局xml中设置textView的字段 android:maxLines="2&q ...
- Android开发笔记(八十九)单例模式
基本概念 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,从而方便对实例个数的控制并节约系统资源. 单例模式有三个特点: 1.某个类只能有一个实例: 2.它要自行创建这个实例: 3.它只有 ...
- Android开发笔记(七十九)资源与权限校验
硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...
- Android开发自定义UI组件
Android开发自定义UI组件实现红色小球跟随手指移动 要写实现自定义UI组件,要创建一个BallView类,继承View类,在BallView类中创建画笔,然后重写OnDraw()方法和OnTou ...
- Android开发-UI界面--类微信页面设计
Android开发-UI界面–类微信页面设计 一.功能说明 设计一个类似微信的主页面框架,UI布局为上中下结构,包含了四个tag页面 二.开发技术 本次用到了layout.xml.控件.监听.fr ...
- Android开发——自定义炫酷PickerView惯性滚动魔改
Android开发--自定义炫酷PickerView快速滚动魔改 最近由于课内压力的增加和安卓课设项目,故没有怎么刷acm题,基本上学校要训练也就去水一波,程序设计相关内容也鸽了. 由于从来没有做过开 ...
- android开发自定义View(三)仿芝麻信用积分
此文参考了https://github.com/HotBitmapGG/CreditSesameRingView 感谢作者的分享!! 首先看一下支付宝上显示的样子 然后看一下模仿的效果 代码 基础部分 ...
- android view 点击变暗,Android应用开发Android ImageView点击变暗效果
本文将带你了解Android应用开发Android ImageView点击变暗效果,希望本文对大家学Android有所帮助. < 自定义ImageView: 在ImageView中setPres ...
- 【genius_platform软件平台开发】第七十九讲:Linux系统中可执行程序后台运行的几种方式
[genius_platform软件平台开发]第七十九讲:Linux系统中可执行程序后台运行的几种方式 1. 问题描述 2. & 符号 3. nohup指令 4. ctrl + z.jobs. ...
最新文章
- 在okhttp3,WebView中忽略HTTPS证书校验
- 王立飞:专注己之长 跨界求发展
- ETSI GS MEC 013,UE 位置 API
- Linux下VTK、ITK的安装及运行 转载
- 2020-12-02
- struts实现文件下载
- python整数类型进制表示_Python的基本数值类型
- mybatis PageBounds应用分页
- scrapy vs requests+beautifulsoup
- jdbc mysql 存储过程执行失败_JDBC连接执行MySQL存储过程报权限错误
- 动态规划背包问题之完全背包详解
- HTML的标签与属性/title标签/meta标签/
- 郁闷,俺被S3C2416 狠狠的暗算了一把。
- 有关H5第八章的页面布局与规划介绍
- CRC16校验使用体验
- Python实现淘宝爬取——奶粉销售信息爬取及其数据可视化
- 那一夜后,我病了....
- .Net 官方学习文档
- Csharp 判断UNICODE字符是否属于汉字
- 浙大计算机的学硕和专硕,浙大计算机学硕复试线399分,专硕375,不愧被称为“炸大”...
热门文章
- 老师利用计算机分析学生成绩属于什么,倾向分数方法应用:中学生课堂计算机使用对其数学成绩的影响...
- 桌面删除快捷方式箭头之后不能锁定任务栏
- 天源迪科笔试20121115
- 将py文件转换成html,(2条消息)自制 Python小工具 将markdown文件转换成Html文件
- C/C++ 名正则言顺
- Java面试官一般这样问,掌握这些你也可以拿offer到手软
- 李阳疯狂英语突破对话(10)-美国人长得都一个样
- react引用Ant Design后,表格点击时添加背景色
- java做飞机大战_Java+swing版飞机大战
- 深度学习炼丹-不平衡样本的处理