项目地址:https://github.com/604982372/IrregularView.git
效果显示:
实现原理
我这里实现android不规则区域选择是通过坐标和当前点击区域的颜色(本项目使用蓝色)来实现。
(1)手机分辨率不同,加载的图片宽高也不同,选择一个流行分辨率手机来打印坐标,把每张图片中蓝色区域的每个坐标(减去左边距,上边距)和每个区域蓝色坐标个数记录下来,存到strings.xml文件里面作为样本。
(2)使用的时候(可以是不同分辨率手机下运行)将当前点击的坐标减去左边距,上边距,转换为加载到手机内存里面图片的坐标,然后将这个坐标转换为样本图片宽高下对应的坐标(当前手机图片宽高跟样本图片宽高程等比关系)。
(3)然后从strings.xml中取出样本坐标集合,根据转换后的坐标来查找样本中相同的坐标,记录样本集合中该相同坐标的位置,根据strings.xml记录的每张图片蓝色坐标的个数来判断当前坐标属于哪一张图片,然后将对应的图片显示出来。
这个功能实现要将选择颜色与图片本身颜色分开,要从图片红绿蓝中选择一个颜色来筛选坐标。比如我项目中的手掌,手掌本来原色为浅黄色RGB值为(254 , 235,196),手掌边界的为暗红色RGB值为(127,11,12),选择区域颜色为蓝色RGB值为(2,169 ,237),蓝色为196,12,237,目标颜色237数值最大,打印坐标的时候由于蓝色跟黄色过度地方颜色会变浅,这里边界最浅B值是208,所以循环判断b值大于207的坐标就打印记录下来
int pixel = bitmap.getPixel(j, k);
int red = Color.blue(pixel);
if (red >= 207)
{
pixels = pixels + red + "*******";
int x = j * (width / mainBitmapWidth) + paddingLeft;
int y = k * (height / mainBitmapHeight) + paddingTop;
coordinates = coordinates + x + "%%" + y + "====";//把坐标拼接起来
count++;//记录每张图片保存坐标的个数
}
实现步骤
1.准备一套图片,每张图片大小一样,可以重合,边界都不要重合,重合会影响准确性。
2.项目中布局(最好切好尺寸图,自定义大小会影响准确性)
<cn.xiwu.myview.IrregularView
android:id="@+id/il"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/a"
/>
3.把整套图id传递给IrregularView
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IrregularView irView = (IrregularView) findViewById(R.id.il);
irView.setImgResIds(new int[]{
R.drawable.a,
R.drawable.c,
R.drawable.f,
R.drawable.h,
R.drawable.i,
R.drawable.j,
R.drawable.k,
R.drawable.l,
R.drawable.m,
R.drawable.n,
R.drawable.o,
R.drawable.p,
R.drawable.q,
R.drawable.r,
R.drawable.s,
R.drawable.t,
R.drawable.u,
R.drawable.v,
R.drawable.y});
}
4.选择一个市面上主流分辨率的手机(我这里选择1920*1080),首次运行是采集坐标所有图蓝色区域坐标(ps:每张图的蓝色区域不重合)
采集坐标的时候要打开线程循环。
(1)收集坐标到Strings.xml文件。
通过"3699coorstr"打印过滤获取坐标,复制粘贴出来
通过"3699coorcount"打印过滤获取每张图片红色区域坐标个数,复制出来
“8%%29”表示坐标点“====”是分隔符
“100”表示第一张图片红色区域坐标有100个
把数据粘贴到strings.xml
注意命名要于IrregularView类中的一致
(2)通过"3699daxiao"打印过滤获取上面选用的模板手机下该图片的大小
修改IrregularView类中的样本宽高
(3)测试通过后记得关闭打印坐标的线程,收集完坐标后,不用在启动该线程。
项目地址:https://github.com/604982372/IrregularView.git