今天没事的时候,感觉Win8的扁平化的button还是挺好看的,就研究了下怎样在安卓界面实现Win8的扁平化button点击效果。

发现了一个自己定义的View能够实现扁平化button效果,话不多说,我们直接上代码。

1、首先要自己定义自己的View。创建一个自己定义的MyImageView类继承ImageView,并实现点击效果的设定。

public class MyImageView extends ImageView {

   private boolean onAnimation = true;// 是否处于动画状态
private int rotateDegree = 10;// 运行动画的时间
private boolean isFirst = true;// 标识是否为第一次绘制视图
private float minScale = 0.95f;// 最小缩放限度
private int vWidth;// 视图宽度
private int vHeight;// 视图高度
private boolean isFinish = true;// 标识是否为结束
private boolean isActionMove = false;// 标识是否在移动状态
private boolean isScale = false;// 标识是否为缩放状态
private Camera camera; boolean XbigY = false;// 是否放大
float RolateX = 0;// 旋转的X轴点
float RolateY = 0;// 旋转的Y轴点

OnViewClick onclick = null; public MyImageView(Context context) {
super(context);
// TODO Auto-generated constructor stub
camera = new Camera();
} public MyImageView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
camera = new Camera();
} public void SetAnimationOnOff(boolean oo) {
onAnimation = oo;
} /**
* 设置点击事件
*
* @param onclick
*/
public void setOnClickIntent(OnViewClick onclick) {
this.onclick = onclick;
} /**
* 绘制View
*/
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (isFirst) {// 推断是否为第一次进入
isFirst = false;
init();
}
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG
| Paint.FILTER_BITMAP_FLAG));// 抗锯齿
} /**
* 初始化视图---初始化配置
*/
public void init() {
vWidth = getWidth() - getPaddingLeft() - getPaddingRight();
vHeight = getHeight() - getPaddingTop() - getPaddingBottom();
Drawable drawable = getDrawable();
BitmapDrawable bd = (BitmapDrawable) drawable;
bd.setAntiAlias(true);
} /**
* 触摸监听
*/
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
if (!onAnimation)// 推断是否为动画状态
return true; switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:// 按下
float X = event.getX();
float Y = event.getY();
RolateX = vWidth / 2 - X;
RolateY = vHeight / 2 - Y;
XbigY = Math.abs(RolateX) > Math.abs(RolateY) ? true : false; isScale = X > vWidth / 3 && X < vWidth * 2 / 3 && Y > vHeight / 3
&& Y < vHeight * 2 / 3;
isActionMove = false; if (isScale) {// 推断是否同意缩放
scaleHandler.sendEmptyMessage(1);
} else {
rolateHandler.sendEmptyMessage(1);
}
break;
case MotionEvent.ACTION_MOVE:// 移动
float x = event.getX();
float y = event.getY();
if (x > vWidth || y > vHeight || x < 0 || y < 0) {
isActionMove = true;
} else {
isActionMove = false;
} break;
case MotionEvent.ACTION_UP:// 松开
if (isScale) {// 推断是否同意缩放
scaleHandler.sendEmptyMessage(6);
} else {
rolateHandler.sendEmptyMessage(6);
}
break;
}
return true;
} /**
* 自己定义View点击事件接口
*/
public interface OnViewClick {
public void onClick();
} /**
* 旋转动画的Handler,依据状态运行动画
*/
@SuppressLint("HandlerLeak")
private Handler rolateHandler = new Handler() {
private Matrix matrix = new Matrix();
private float count = 0; @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
matrix.set(getImageMatrix());
switch (msg.what) {
case 1:
count = 0;
BeginRolate(matrix, (XbigY ? count : 0), (XbigY ? 0 : count));
rolateHandler.sendEmptyMessage(2);
break;
case 2:
BeginRolate(matrix, (XbigY ? count : 0), (XbigY ? 0 : count));
if (count < getDegree()) {
rolateHandler.sendEmptyMessage(2);
} else {
isFinish = true;
}
count++;
count++;
break;
case 3:
BeginRolate(matrix, (XbigY ? count : 0), (XbigY ? 0 : count));
if (count > 0) {
rolateHandler.sendEmptyMessage(3);
} else {
isFinish = true;
if (!isActionMove && onclick != null) {
onclick.onClick();
}
}
count--;
count--;
break;
case 6:
count = getDegree();
BeginRolate(matrix, (XbigY ? count : 0), (XbigY ? 0 : count));
rolateHandler.sendEmptyMessage(3);
break;
}
}
}; /**
* 開始旋转--使用线程锁控制,确保每次仅仅运行一个动作
*
* @param matrix
* @param rolateX
* @param rolateY
*/
private synchronized void BeginRolate(Matrix matrix, float rolateX,
float rolateY) {
int scaleX = (int) (vWidth * 0.5f);
int scaleY = (int) (vHeight * 0.5f);
camera.save();
camera.rotateX(RolateY > 0 ? rolateY : -rolateY);
camera.rotateY(RolateX < 0 ? rolateX : -rolateX);
camera.getMatrix(matrix);
camera.restore();
// 控制中心点
if (RolateX > 0 && rolateX != 0) {
matrix.preTranslate(-vWidth, -scaleY);
matrix.postTranslate(vWidth, scaleY);
} else if (RolateY > 0 && rolateY != 0) {
matrix.preTranslate(-scaleX, -vHeight);
matrix.postTranslate(scaleX, vHeight);
} else if (RolateX < 0 && rolateX != 0) {
matrix.preTranslate(-0, -scaleY);
matrix.postTranslate(0, scaleY);
} else if (RolateY < 0 && rolateY != 0) {
matrix.preTranslate(-scaleX, -0);
matrix.postTranslate(scaleX, 0);
}
setImageMatrix(matrix);
} /**
* 缩放动画Handler
*/
@SuppressLint("HandlerLeak")
private Handler scaleHandler = new Handler() {
private Matrix matrix = new Matrix();
private float s;
int count = 0; @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
matrix.set(getImageMatrix());
switch (msg.what) {
case 1:
if (!isFinish) {
return;
} else {
isFinish = false;
count = 0;
s = (float) Math.sqrt(Math.sqrt(minScale));
BeginScale(matrix, s);
scaleHandler.sendEmptyMessage(2);
}
break;
case 2:
BeginScale(matrix, s);
if (count < 4) {
scaleHandler.sendEmptyMessage(2);
} else {
isFinish = true;
if (!isActionMove && onclick != null) {
onclick.onClick();
}
}
count++;
break;
case 6:
if (!isFinish) {
scaleHandler.sendEmptyMessage(6);
} else {
isFinish = false;
count = 0;
s = (float) Math.sqrt(Math.sqrt(1.0f / minScale));
BeginScale(matrix, s);
scaleHandler.sendEmptyMessage(2);
}
break;
}
}
}; /**
* 開始缩放动画
*
* @param matrix
* @param scale
*/
private synchronized void BeginScale(Matrix matrix, float scale) {
int scaleX = (int) (vWidth * 0.5f);
int scaleY = (int) (vHeight * 0.5f);
matrix.postScale(scale, scale, scaleX, scaleY);
setImageMatrix(matrix);
} /**
* 获取运行的时间--旋转
*
* @return
*/
public int getDegree() {
return rotateDegree;
} /**
* 设置动画时间--旋转
*
* @param degree
*/
public void setDegree(int degree) {
rotateDegree = degree;
} /**
* 获取缩放程度
*
* @return
*/
public float getScale() {
return minScale;
} /**
* 设置视图缩放度
*
* @param scale
*/
public void setScale(float scale) {
minScale = scale;
}
}

当中Record类的主要内容例如以下:
public class Record{

   public int getDegrees(float a, float b) {
float dx = a;
float x = b / 4;
float x2 = 3 * b / 4;
if (dx < x / 10)
return 10;
else if (dx < x / 5)
return 9;
else if (dx < x * 3 / 10)
return 8;
else if (dx < x * 2 / 5)
return 7;
else if (dx < x * 5 / 10)
return 6;
else if (dx < x * 3 / 5)
return 5;
else if (dx < x * 7 / 10)
return 4;
else if (dx < x * 4 / 5)
return 3;
else if (dx < x * 9 / 10)
return 2;
else if (dx < x)
return 2;
else if (dx - x2 > x * 9 / 10)
return 10;
else if (dx - x2 > x * 4 / 5)
return 9;
else if (dx - x2 > x * 7 / 10)
return 8;
else if (dx - x2 > x * 3 / 5)
return 7;
else if (dx - x2 > x * 5 / 10)
return 6;
else if (dx - x2 > x * 2 / 5)
return 5;
else if (dx - x2 > x * 3 / 10)
return 4;
else if (dx - x2 > x / 5)
return 3;
else if (dx - x2 > x / 10)
return 2;
return 10;
}

}

2、定义好了自己的ImageView后,在给界面加入button的时候,引用自己定义的ImageView就可以。



Android仿Win8界面的button点击的更多相关文章

  1. Android 仿Win8的metro的UI界面(上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/23441455 昨晚没事手机下载了一些APP,发现现在仿win8的主界面越来越多, ...

  2. 实现 在子界面的button按下,在主界面的label显示。

    不知道理解的对不对,反正功能是实现了. 这是子界面,COM口配置界面的 .H文件的定义.下面的Private:定义了Ui:MainWindow  *main_ui;的指针变量      要   注  ...

  3. Android开发-之监听button点击事件

    一.实现button点击事件的方法 实现button点击事件的监听方法有很多种,这里总结了常用的四种方法: 1.匿名内部类 2.外部类(独立类) 3.实现OnClickListener接口 4.添加X ...

  4. Android仿WIN8系统磁贴点击下沉倾斜效果

    ※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZ2xvbmd4aW4yNA==/font/5a6L5L2T/fontsize/400/fil ...

  5. android仿win8

    在 eoe上偶然发现已经有人实现了这个功能的源码(地址:http://www.eoeandroid.com /forum.php?mod=viewthread&tid=327557),马上下载 ...

  6. android仿win8 metro磁贴布局

    代码下载     //更新代码,   这里是更新后的代码 //////////////////////// 1,含一个图片无限滚动的控件,自己实现的 2.可新增删除每个磁贴 3.来个图片吧 ////* ...

  7. 仿it快播顶部button点击背景滑动切换的效果

    最近在it快播中看见它顶部的几个button可以点击后 背景会滑动到相应的button后面 就得很好看 就想办法实现了那效果 思路 大概就是通过view的叠加 把3个button通过RelativeL ...

  8. VC/Wince 实现仿Win8 Metro风格界面1——设计概述和自绘Button(附效果图)

    去年用VC做了一个仿Win8 Metro风格的界面,感觉挺有意思,最近打算把实现过程和一些技术原理记录下来. 主要是风格上类似Win8,其实功能上很多借鉴了Android的操作方式.界面只支持两种大小 ...

  9. Android笔记——Button点击事件几种写法

    Button点击事件:大概可以分为以下几种: 匿名内部类 定义内部类,实现OnClickListener接口 定义的构造方法 用Activity实现OnClickListener接口 指定Button ...

随机推荐

  1. Android布局文件的载入过程分析:Activity.setContentView()源代码分析

    大家都知道在Activity的onCreate()中调用Activity.setContent()方法能够载入布局文件以设置该Activity的显示界面.本文将从setContentView()的源代 ...

  2. UvaLive 6600 Spanning trees in a secure lock pattern 矩阵行列式

    链接:https://icpcarchive.ecs.baylor.edu/index.php? option=com_onlinejudge&Itemid=8&page=show_p ...

  3. POJ 1682 DP

    原创: http://www.cnblogs.com/proverbs/archive/2012/10/03/2711151.html 超高仿: http://blog.csdn.net/mars_c ...

  4. 超级硬件代理解决企业Web提速上网问题

    超级硬件代理解决企业Web提速上网问题 需求分析: XX集团是五家企业重组建立的特大型工程勘察设计咨询企业,下设10多个分公司,上网人数众多.有多台WEB server,对外服务,访问量及大.以前无论 ...

  5. C++ new 的用法

    原文链接:http://www.builder.com.cn/2008/0104/696370.shtml “new”是C++的一个关键字,同时也是操作符.关于new的话题非常多,因为它确实比较复杂, ...

  6. Android针对不同的手机屏幕大小设计图片资源与编码

    注:本文转载于:http://blog.csdn.net/welovesunflower/article/details/7930248 一些术语 Screen Size 屏幕尺寸: 实际的物理尺寸, ...

  7. sublime 编辑器汉化

    一.下载Sublime编辑器 官网下载地址:http://www.sublimetext.com/3 二.下载汉化包 汉化包下载地址:http://files.cnblogs.com/akwwl/su ...

  8. rman 备份并异机恢复

    1.RMAN 备份脚本 RUN { CONFIGURE RETENTION POLICY DAYS; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CO ...

  9. springboot 前后端分离开发解决跨域访问

    最近新学习了Java EE开发框架springboot,我在使用springboot前后台分离开发的过程中遇到了跨域求问题.在网上寻找答案的过程中发现网上的解决方案大多比较零散,我在这里整理一个解决方 ...

  10. Qt Quick 之 PathView 具体解释

    PathView ,顾名思义,沿着特定的路径显示 Model 内的数据. Model 能够是 QML 内建的 ListModel . XmlListModel ,也能够是在 C++ 中实现的 QAbs ...