Android自定义View实现优惠券效果

简介: Android自定义View实现优惠券效果

最近做项目的时候需要一个卡劵的效果,如图:

image.png

上面的图片其实和普通的Linearlayout,RelativeLayout一样,只是上下两边多了类似于半圆锯齿的形状。那么只需要处理不同地方。可以在上下两条线上画一个个白色的小圆来实现这种效果。

假如我们上下线的半圆以及半圆与半圆之间的间距是固定的,那么不同尺寸的屏幕肯定会画出不同数量的半圆,那么我们只需要根据控件的宽度来获取能画的半圆数。

大家观察图片,很容易发现,圆的数量总是圆间距数量-1,也就是,假设圆的数量是circleNum,那么圆间距就是circleNum+1。

所以我们可以根据这个计算出circleNum. circleNum = (int) ((w-gap)/(2*radius+gap)); 这里gap就是圆间距,radius是圆半径,w是view的宽。


1. public class CouponDisplayView extends LinearLayout {
2. 
3. private Paint mPaint;
4. /**
5.      * 圆间距
6.      */
7. private float gap = 8;
8. /**
9.      * 半径
10.      */
11. private float radius = 10;
12. /**
13.      * 圆数量
14.      */
15. private int circleNum;
16. 
17. private float remain;
18. 
19. 
20. public CouponDisplayView(Context context) {
21. super(context);
22.     }
23. 
24. public CouponDisplayView(Context context, AttributeSet attrs) {
25. super(context, attrs);
26.         mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
27.         mPaint.setDither(true);
28.         mPaint.setColor(Color.WHITE);
29.         mPaint.setStyle(Paint.Style.FILL);
30.     }
31. 
32. @Override
33. protected void onSizeChanged(int w, int h, int oldw, int oldh) {
34. super.onSizeChanged(w, h, oldw, oldh);
35. if (remain==0){
36.             remain = (int)(w-gap)%(2*radius+gap);
37.         }
38.         circleNum = (int) ((w-gap)/(2*radius+gap));
39.     }
40. 
41. 
42. public CouponDisplayView(Context context, AttributeSet attrs, int defStyleAttr) {
43. super(context, attrs, defStyleAttr);
44.     }
45. @Override
46. protected void onDraw(Canvas canvas) {
47. super.onDraw(canvas);
48. for (int i=0;i<circleNum;i++){
49. float x = gap+radius+remain/2+((gap+radius*2)*i);
50.             canvas.drawCircle(x,0,radius,mPaint);
51.             canvas.drawCircle(x,getHeight(),radius,mPaint);
52.         }
53.     }


简单的根据circleNum的数量进行了圆的绘制。这里remain/2是因为,可以一些情况,计算出来的可以画的数量不是刚好整除的。这样就会出现右边最后一个间距会比其它的间距都要宽。所以我们在绘制第一个的时候加上了余下的间距的一半,即使是不整除的情况。至少也能保证第一个和最后一个间距宽度一致。


使用:

1. <?xml version="1.0" encoding="utf-8"?>
2. <FrameLayout
3. xmlns:android="http://schemas.android.com/apk/res/android"
4. android:layout_width="match_parent"
5. android:layout_height="wrap_content"
6. android:paddingLeft="16dp"
7. android:paddingRight="16dp"
8. android:paddingTop="20dp">
9. <com.qiangyu.test.view.CouponDisplayView
10. android:orientation="horizontal" android:layout_width="match_parent"
11. android:layout_height="wrap_content"
12. android:background="@color/indicator_color"
13. android:padding="20dp">
14. <ImageView
15. android:layout_width="120dp"
16. android:layout_height="match_parent"
17. android:src="@drawable/goods_test"
18. android:scaleType="centerCrop"/>
19. <LinearLayout
20. android:layout_width="match_parent"
21. android:layout_height="wrap_content"
22. android:orientation="vertical"
23. android:paddingLeft="16dp">
24. <TextView
25. android:layout_width="wrap_content"
26. android:layout_height="wrap_content"
27. android:textSize="18dp"
28. android:text="美食劵"
29.                 />
30. <TextView
31. android:layout_width="wrap_content"
32. android:layout_height="wrap_content"
33. android:textSize="12dp"
34. android:padding="5dp"
35. android:text="编号:11223124123213131"
36.                 />
37. <TextView
38. android:layout_width="wrap_content"
39. android:layout_height="wrap_content"
40. android:textSize="12dp"
41. android:padding="5dp"
42. android:text="编号:11223124123213131"
43.                 />
44. <TextView
45. android:layout_width="wrap_content"
46. android:layout_height="wrap_content"
47. android:textSize="12dp"
48. android:paddingLeft="5dp"
49. android:paddingTop="5dp"
50. android:text="截止日期:2001-09-07"
51.                 />
52. </LinearLayout>
53. </com.qiangyu.test.view.CouponDisplayView>
54. </FrameLayout>


目录
相关文章
|
2天前
|
Android开发
Android自定义View之正方形
【6月更文挑战第23天】
|
3天前
|
搜索推荐 Android开发 开发者
Android 自定义组件
Android 自定义组件
6 0
|
10天前
|
开发工具 Android开发
Android 代码自定义drawble文件实现View圆角背景
Android 代码自定义drawble文件实现View圆角背景
16 0
|
10天前
|
Android开发
Android 自定义View 测量控件宽高、自定义viewgroup测量
Android 自定义View 测量控件宽高、自定义viewgroup测量
16 0
|
10天前
|
开发工具 Android开发 git
Android自定义View——可以设置最大宽高的FrameLayout
Android自定义View——可以设置最大宽高的FrameLayout
21 0
|
10天前
|
JSON Android开发 数据格式
Android动态添加view设置view大小(宽高)
Android动态添加view设置view大小(宽高)
10 0
|
3天前
|
安全 Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的深度对比
在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文旨在通过数据驱动的分析方法,深入探讨这两大操作系统在开发环境、用户界面设计及市场表现等方面的差异。引用最新的行业报告和科研数据,结合技术专家的观点,本文将提供对开发者和市场分析师均有价值的洞见。
|
10天前
|
安全 Java Android开发
安卓开发中的新趋势:Kotlin与Jetpack的完美结合
【6月更文挑战第20天】在不断进化的移动应用开发领域,Android平台以其开放性和灵活性赢得了全球开发者的青睐。然而,随着技术的迭代,传统Java语言在Android开发中逐渐显露出局限性。Kotlin,一种现代的静态类型编程语言,以其简洁、安全和高效的特性成为了Android开发中的新宠。同时,Jetpack作为一套支持库、工具和指南,旨在帮助开发者更快地打造优秀的Android应用。本文将探讨Kotlin与Jetpack如何共同推动Android开发进入一个新的时代,以及这对开发者意味着什么。
|
6天前
|
Java 开发工具 Android开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着半壁江山。本文将深入探讨这两个平台在开发过程中的关键差异点,包括编程语言、开发工具、用户界面设计、性能优化以及市场覆盖等方面。通过对这些关键因素的比较分析,旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和目标受众做出明智的平台选择。