点击按钮的动画,点击出现阴影,松开后逐渐扩散到整个按钮
来源:互联网 发布:mac好玩的大型游戏 编辑:程序博客网 时间:2024/05/14 13:20
直接继承View实现,属性全部自定义
<?xml version="1.0" encoding="utf-8"?><resources> <!-- 按钮的背景色 --> <attr name="back_ground_color" format="color" /> <!-- 点击的阴影颜色 --> <attr name="click_color" format="color" /> <!-- 文本 --> <attr name="text" format="string" /> <!-- 文本的位置 --> <attr name="text_position" format="enum"> <enum name="left" value="0" /> <enum name="center" value="1" /> <enum name="right" value="2" /> </attr> <!-- 文字的大小 --> <attr name="text_size" format="dimension" /> <!-- 文字的颜色 --> <attr name="text_color" format="color" /> <declare-styleable name="click_view"> <attr name="back_ground_color" /> <attr name="click_color" /> <attr name="text" /> <attr name="text_position" /> <attr name="text_size" /> <attr name="text_color" /> </declare-styleable></resources>
具体实现类
package com.sunrui.mysport.widget;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import com.sunrui.mysport.R;/** * Created by sunrui on 15/9/9. * 点击扩散效果的View */public class ClickView extends View { /** * 背景颜色 */ private int background_color; /** * 点击时的颜色 */ private int click_color; /** * 显示的文本 */ private String text; /** * 文本颜色 */ private int text_color; /** * 文本位置 * 0 左侧 * 1 居中 * 2 右侧 */ private int text_position; /** * 文本大小 */ private float text_size; /** * 控件的宽 */ private int width; /** * 控件的高 */ private int height; /** * 文本区域大小 */ private Rect text_area; /** * 文本画笔 */ private Paint text_p; /** * 背景画笔 */ private Paint background_p; /** * 点击效果的画笔 */ private Paint click_p; /** * 点击阴影的半径 */ private float radius; /** * 阴影部分区域 */ private RectF shadow_area; public ClickView(Context context) { super(context); } public ClickView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs); } public ClickView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } private void init(Context context, AttributeSet attrs) { TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.click_view, 0, 0); int n = typedArray.getIndexCount(); for (int i = 0; i < n; i++) { int attr = typedArray.getIndex(i); switch (attr) { case R.styleable.click_view_back_ground_color: background_color = typedArray.getColor(attr, Color.WHITE); break; case R.styleable.click_view_click_color: click_color = typedArray.getColor(attr, Color.GRAY); break; case R.styleable.click_view_text: text_area = new Rect(); text = typedArray.getString(attr); break; case R.styleable.click_view_text_color: text_color = typedArray.getColor(attr, Color.BLACK); break; case R.styleable.click_view_text_position: text_position = typedArray.getInt(attr, 1); break; case R.styleable.click_view_text_size: text_size = typedArray.getDimension(attr, 32.0f); break; default: break; } } background_p = new Paint(); text_p = new Paint(); click_p = new Paint(); shadow_area = new RectF(0, 0, 0, 0); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { width = 0; height = 0; int specMode = MeasureSpec.getMode(widthMeasureSpec); int specSize = MeasureSpec.getSize(widthMeasureSpec); switch (specMode) { case MeasureSpec.EXACTLY: width = getPaddingLeft() + getPaddingRight() + specSize; break; case MeasureSpec.AT_MOST: if (text_area != null) { width = getPaddingLeft() + getPaddingRight() + text_area.width(); } else { width = getPaddingLeft() + getPaddingRight(); } break; default: break; } specMode = MeasureSpec.getMode(heightMeasureSpec); specSize = MeasureSpec.getSize(heightMeasureSpec); switch (specMode) { case MeasureSpec.EXACTLY: height = getPaddingTop() + getPaddingBottom() + specSize; break; case MeasureSpec.AT_MOST: if (text_area != null) { height = getPaddingTop() + getPaddingBottom() + text_area.height(); } else { height = getPaddingTop() + getPaddingBottom(); } break; default: break; } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { //绘制背景 background_p.setColor(background_color); canvas.drawRect(0, 0, width, height, background_p); //绘制文字 text_p.setColor(text_color); text_p.setTextSize(text_size); float text_x = 0f; text_p.getTextBounds(text, 0, text.length(), text_area); float text_y = (height + text_area.height()) / 2; Log.v("sss", text_y + "===" + height + "===" + text_area.height()); if (text_position == 0) { text_x = 0f; } else if (text_position == 1) { text_x = (width - text_area.width()) / 2; Log.v("sss", width + "===" + text_area.width() + text_area.height()); } else if (text_position == 2) { text_x = width - text_area.width(); } canvas.drawText(text, text_x, text_y, text_p); //绘制阴影 click_p.setColor(click_color); canvas.drawArc(shadow_area, 0, 360, false, click_p); } @Override public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); final float click_x = event.getX(); switch (action) { case MotionEvent.ACTION_DOWN: radius = height * 1.5f; shadow_area = new RectF(click_x - radius / 2, (height - radius) / 2, click_x + radius / 2, (height + radius) / 2); postInvalidate(); break; case MotionEvent.ACTION_UP: new Thread() { @Override public void run() { while (true) { if (radius > width * 2.0f) { break; } radius += width / 18; shadow_area = new RectF(click_x - radius / 2, (height - radius) / 2, click_x + radius / 2, (height + radius) / 2); try { Thread.sleep(300/18); } catch (InterruptedException e) { e.printStackTrace(); } postInvalidate(); } shadow_area = new RectF(0, 0, 0, 0); } }.start(); break; default: break; } return true; }}
布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.sunrui.mysport.ui.AddSportItemActivity"> <com.sunrui.mysport.widget.ClickView android:layout_width="match_parent" android:layout_height="48dp" custom:back_ground_color="#ffffff" custom:click_color="#33000000" custom:text="点击测试" custom:text_position="center" custom:text_size="32px" custom:text_color="#00ff00"/></RelativeLayout>
如果不是在Android studio中,将第二行的res-auto改成包名
1 0
- 点击按钮的动画,点击出现阴影,松开后逐渐扩散到整个按钮
- 点击jsp页面按钮后,禁用整个页面的方法
- Android Button按钮点击时和松开的效果
- 点击按钮 按钮缩放动画:
- 点击按钮后出现新的输入画面,否则隐藏
- ListView上的出现按钮后行不能点击了
- 点击按钮后跳转到php网页
- 点击后按钮消失
- 点击按钮出现新窗口
- MFC 设置按钮背景,点击后切换背景(不是按下时和松开时切换)
- 【代码笔记】iOS-点击一个按钮会出现多个按钮的动画效果
- IOS中点击验证按钮后验证按钮上出现数字的递减
- 按钮点击上传数据的动画效果
- 按钮点击动画的三种实现
- uibutton点击按钮时title变大 松开时变小
- Android分享按钮点击后的事件
- 点击按钮后弹出新的对话框
- 屏蔽点击Dialog按钮后的关闭
- subversion启动关闭
- MD5加密算法
- CentOS安装VMware Tools
- [iOS开发]C语言-03-程序分支结构(switch)视频解说
- 凡士林解脚癣
- 点击按钮的动画,点击出现阴影,松开后逐渐扩散到整个按钮
- 有才人捉知了猴、啪嚓
- UI界面:手写UI代码或者使用xib和StoryBoard制作UI界面的区别和分析
- UICollectionView学习<1>之UICollectionView的简单使用
- 对锁的全局控制
- Google全新Logo发布:适应更多平台-兄弟连IT教育
- Py的UUID介绍
- Linux战地日记——复制、删除和移动文件的命令
- PHP中this,self,parent的区别