文档章节

Android进阶学习-实现卡券效果

August1996_
 August1996_
发布于 2016/05/22 10:48
字数 557
阅读 20
收藏 0
点赞 2
评论 0

之前看了一个类似的博客,想来自己实现一下,嘿嘿,贴一下效果图:

 

先说一下原理,卡券的实现是拓展了LinearLayout的,然后凹凸的效果是通过画圆的方式来画出来的,只要控制位置,就能够画出半圆的效果.下面我们看编码:

1.attrs属性文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="CustomContainer">
        <attr name="mColor" format="color" />
        <attr name="mGap" format="dimension" />
        <attr name="mHalfRadius" format="dimension" />
    </declare-styleable>

</resources>

2.CustomContainer.java文件:

package com.example.customview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.widget.LinearLayout;

public class CustomContainer extends LinearLayout {
	
	private int		mRadius;
	private int		mGap;
	private int		mColor;
	private Paint	mPaint;
					
	public CustomContainer(Context context) {
		this(context, null);
	}
	
	public CustomContainer(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}
	
	public CustomContainer(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		
		TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomContainer, defStyleAttr, 0);
		
		int n = ta.getIndexCount();
		
		for (int i = 0; i < n; i++) {
			int attr = ta.getIndex(i);
			switch (attr) {
				case R.styleable.CustomContainer_mColor:
					mColor = ta.getColor(attr, Color.TRANSPARENT);
					break;
				case R.styleable.CustomContainer_mGap:
					mGap = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ta.getDimension(attr, 3),
							getResources().getDisplayMetrics());
					break;
				case R.styleable.CustomContainer_mHalfRadius:
					mRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ta.getDimension(attr, 20),
							getResources().getDisplayMetrics());
					break;
					
				default:
					break;
			}
		}
		
		ta.recycle();
		/**
		 * 上面是初始化属性参数...不想说啦!!!
		 */
		
		mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		mPaint.setStyle(Paint.Style.FILL);
		mPaint.setColor(mColor);
		/**
		 * 初始化画笔
		 */
	}
	
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		
		/**
		 * 下面就是计算啦,没有意外的话,博客会给一张图来解析的
		 */
		
		int n = (mGap + getWidth()) / (2 * mRadius + mGap);
		/**
		 * 2*mRadius*n+(n-1)*mGap=geiWidth()转化而来
		 */
		
		int centerTopY = 0;
		int centerBottomY = getHeight();
		
		for (int i = 0; i < n; i++) {
			int centerX = 2 * mRadius * (i + 1) + i * mGap;
			canvas.drawCircle(centerX, centerTopY, mRadius, mPaint);
			canvas.drawCircle(centerX, centerBottomY, mRadius, mPaint);
		}
		
	}
}

3.布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
    tools:context="com.example.customview.Main5Activity" >

    <com.example.customview.CustomContainer
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:background="#ffbb33"
        android:padding="20dp"
        app:mColor="#fff"
        app:mGap="15dp"
        app:mHalfRadius="5dp" >

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center" >

            <ImageView
                android:id="@+id/img"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:src="@drawable/jpg" />

            <TextView
                android:id="@+id/caption"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="20dp"
                android:layout_toRightOf="@id/img"
                android:text="韩国美女卡券"
                android:textColor="#666666"
                android:textSize="18sp" />

            <TextView
                android:id="@+id/text1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@id/caption"
                android:layout_below="@id/caption"
                android:layout_marginTop="10dp"
                android:text="秒杀价:50元"
                android:textColor="#ff0000"
                android:textSize="22sp" />

            <TextView
                android:id="@+id/text2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_below="@id/text1"
                android:layout_marginLeft="3dp"
                android:layout_marginTop="10dp"
                android:text="原价:150元"
                android:textColor="#999999"
                android:textSize="14sp" />
        </RelativeLayout>
    </com.example.customview.CustomContainer>

</RelativeLayout>

 

© 著作权归作者所有

共有 人打赏支持
August1996_
粉丝 2
博文 51
码字总数 29055
作品 0
湛江
程序员
android高仿抖音、点餐界面、天气项目、自定义view指示、爬取美女图片等源码

Android精选源码 一个爬取美女图片的app(http://www.apkbus.com/thread-600077-1-1.html) Android高仿抖音(http://www.apkbus.com/thread-600081-1-1.html) android一个可以上拉下滑的Ui效果......

逆鳞龙 ⋅ 06/12 ⋅ 0

android --------学习流程图

如何快速入门和进阶安卓开发,是很多技术小白的疑问。 大家都知道,Android开发要学的技能非常多,技术更新速度还快,但是总的来说:掌握最核心的技术,最规范的开发流程,成为专业、出色的安...

切切歆语 ⋅ 05/06 ⋅ 0

Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊 ⋅ 前天 ⋅ 0

说说 Android 中如何使用摄像头和相册

很多 APP 应用都有用户头像功能,用户既可以调用摄像头马上拍一张美美的自拍,也可以打开相册选取一张心仪的照片作为头像。 1 调用摄像头 布局文件: 活动类代码: getExternalCacheDir() 可...

deniro ⋅ 05/26 ⋅ 0

老生常谈Android的MVP架构

原生框架问题 由于原生 Android 开发应该已经是一个基础的 MVC 框架,所以在初始开发的时候并没有遇到太多框架上的问题,可是一旦项目规模到了一定的程度,就需要对整个项目的代码结构做一个...

LaxusJ ⋅ 04/23 ⋅ 0

Matrix, ColorMatrix

作为Android源码中的一个常用类,它的作用是持有一个3*3的矩阵数组,用于坐标的转换。 Matrix用来制作动画效果、改变图片大小、给图片加各类滤镜等。 Matrix 的应用 - 压缩图像;Matrix 的应...

shareus ⋅ 04/13 ⋅ 0

挖掘安卓宝藏,EMUI会让手机进入“量心定制”时代吗?

如果把移动终端的发展历程看做一部戏剧,那么Android和iOS两种操作系统生态之间的竞争一定是最精彩的一折。 从市场占有率来看,2017年Android手机在全球售出的手机中占据了85.9%份额,其中自...

脑极体 ⋅ 04/17 ⋅ 0

Android插件化开发之动态加载技术学习

Android插件化开发之动态加载技术学习 为什么要插件化开发和动态加载呢?我认为原因有三点: 可以实现解耦 可以解除单个dex函数不能超过65535的限制 可以给apk瘦身,比如说360安全卫士,整个...

幸运券发放 ⋅ 05/18 ⋅ 0

[搬运] 三层界面布局实例展示

本文系搬运过来,原文章链接 http://www.jb51.net/article/39399.htm 给原作者点赞 共同学习,希望对您有所帮助 android实现底部布局往往使用RelativeLayout的布局方式,并且设置android:lay...

sirius_0 ⋅ 2016/01/08 ⋅ 0

Android 进阶之路(我的博客文章目录)

原文地址:http://blog.csdn.net/u011240877 为了方便读者阅读以及自己回顾,总结写过的文章和一些想要写的文章目录如下: 1.Java Java 解惑:Comparable 和 Comparator 的区别 Java 解惑:R...

u011240877 ⋅ 2017/04/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 44分钟前 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 47分钟前 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 50分钟前 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 58分钟前 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

云计算的选择悖论如何对待?

人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云计算为...

linux-tao ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部