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

举报
yechaoa 发表于 2022/05/31 00:07:11 2022/05/31
【摘要】 最近做项目的时候需要一个卡劵的效果,如图: 上面的图片其实和普通的Linearlayout,RelativeLayout一样,只是上下两边多了类似于半圆锯齿的形状。那么只需要处理不同地方。可以在上下两条线上画一个个白色的小圆来实现这种效果。 假如我们上下线的半圆以及半圆与半圆之间的间距是固定的,那么不同尺寸的屏幕肯定会画出不同...

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


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



使用:


  
  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>



原链接:http://www.cnblogs.com/yangqiangyu/p/5499945.html



 

文章来源: blog.csdn.net,作者:yechaoa,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/yechaoa/article/details/59102650

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。