一、图片点击变暗效果

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 实现微信九格图功能(图片不同排布不同) 和 一种图片点击变暗效果相关推荐

  1. android自定义省略号,Android开发自定义TextView省略号样式的方法

    本文实例讲述了Android开发自定义TextView省略号样式的方法.分享给大家供大家参考,具体如下: 在布局xml中设置textView的字段 android:maxLines="2&q ...

  2. Android开发笔记(八十九)单例模式

    基本概念 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,从而方便对实例个数的控制并节约系统资源. 单例模式有三个特点: 1.某个类只能有一个实例: 2.它要自行创建这个实例: 3.它只有 ...

  3. Android开发笔记(七十九)资源与权限校验

    硬件资源 因为移动设备的硬件配置各不相同,为了防止使用了不存在的设备资源,所以要对设备的硬件情况进行检查.一般情况下,前置摄像头.部分传感器在低端手机上是没有的,像SD卡也可能因为用户没插卡使得找不到 ...

  4. Android开发自定义UI组件

    Android开发自定义UI组件实现红色小球跟随手指移动 要写实现自定义UI组件,要创建一个BallView类,继承View类,在BallView类中创建画笔,然后重写OnDraw()方法和OnTou ...

  5. Android开发-UI界面--类微信页面设计

    Android开发-UI界面–类微信页面设计 一.功能说明 设计一个类似微信的主页面框架,UI布局为上中下结构,包含了四个tag页面 二.开发技术 ​ 本次用到了layout.xml.控件.监听.fr ...

  6. Android开发——自定义炫酷PickerView惯性滚动魔改

    Android开发--自定义炫酷PickerView快速滚动魔改 最近由于课内压力的增加和安卓课设项目,故没有怎么刷acm题,基本上学校要训练也就去水一波,程序设计相关内容也鸽了. 由于从来没有做过开 ...

  7. android开发自定义View(三)仿芝麻信用积分

    此文参考了https://github.com/HotBitmapGG/CreditSesameRingView 感谢作者的分享!! 首先看一下支付宝上显示的样子 然后看一下模仿的效果 代码 基础部分 ...

  8. android view 点击变暗,Android应用开发Android ImageView点击变暗效果

    本文将带你了解Android应用开发Android ImageView点击变暗效果,希望本文对大家学Android有所帮助. < 自定义ImageView: 在ImageView中setPres ...

  9. 【genius_platform软件平台开发】第七十九讲:Linux系统中可执行程序后台运行的几种方式

    [genius_platform软件平台开发]第七十九讲:Linux系统中可执行程序后台运行的几种方式 1. 问题描述 2. & 符号 3. nohup指令 4. ctrl + z.jobs. ...

最新文章

  1. 在okhttp3,WebView中忽略HTTPS证书校验
  2. 王立飞:专注己之长 跨界求发展
  3. ETSI GS MEC 013,UE 位置 API
  4. Linux下VTK、ITK的安装及运行 转载
  5. 2020-12-02
  6. struts实现文件下载
  7. python整数类型进制表示_Python的基本数值类型
  8. mybatis PageBounds应用分页
  9. scrapy vs requests+beautifulsoup
  10. jdbc mysql 存储过程执行失败_JDBC连接执行MySQL存储过程报权限错误
  11. 动态规划背包问题之完全背包详解
  12. HTML的标签与属性/title标签/meta标签/
  13. 郁闷,俺被S3C2416 狠狠的暗算了一把。
  14. 有关H5第八章的页面布局与规划介绍
  15. CRC16校验使用体验
  16. Python实现淘宝爬取——奶粉销售信息爬取及其数据可视化
  17. 那一夜后,我病了....
  18. .Net 官方学习文档
  19. Csharp 判断UNICODE字符是否属于汉字
  20. 浙大计算机的学硕和专硕,浙大计算机学硕复试线399分,专硕375,不愧被称为“炸大”...

热门文章

  1. 老师利用计算机分析学生成绩属于什么,倾向分数方法应用:中学生课堂计算机使用对其数学成绩的影响...
  2. 桌面删除快捷方式箭头之后不能锁定任务栏
  3. 天源迪科笔试20121115
  4. 将py文件转换成html,(2条消息)自制 Python小工具 将markdown文件转换成Html文件
  5. C/C++ 名正则言顺
  6. Java面试官一般这样问,掌握这些你也可以拿offer到手软
  7. 李阳疯狂英语突破对话(10)-美国人长得都一个样
  8. react引用Ant Design后,表格点击时添加背景色
  9. java做飞机大战_Java+swing版飞机大战
  10. 深度学习炼丹-不平衡样本的处理