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>


目录
相关文章
|
1月前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
27 1
|
1月前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
40 2
|
1月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
1月前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
41 5
|
2月前
|
缓存 数据处理 Android开发
在 Android 中使用 RxJava 更新 View
【10月更文挑战第20天】使用 RxJava 来更新 View 可以提供更优雅、更高效的解决方案。通过合理地运用操作符和订阅机制,我们能够轻松地处理异步数据并在主线程中进行 View 的更新。在实际应用中,需要根据具体情况进行灵活运用,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在 Android 中使用 RxJava 更新 View 的技巧和方法,为开发高质量的 Android 应用提供有力支持。
|
2月前
|
缓存 调度 Android开发
Android 在子线程更新 View
【10月更文挑战第21天】在 Android 开发中,虽然不能直接在子线程更新 View,但通过使用 Handler、AsyncTask 或 RxJava 等方法,可以实现子线程操作并在主线程更新 View 的目的。在实际应用中,需要根据具体情况选择合适的方法,并注意相关的注意事项和性能优化,以确保应用的稳定性和流畅性。可以通过不断的实践和探索,进一步掌握在子线程更新 View 的技巧和方法,为开发高质量的 Android 应用提供支持。
43 2
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
2月前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
29 2
|
Android开发
自定义android 4.0以上的对话框风格
做个笔记,这里是Dialog的风格,如果是用AlertDialog创建的,不能直接用。在styles.xml的写法: 22sp @color/font_green 1 true @st...
709 0
|
20天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
40 19