我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

手机下载了一些APP,发现现在仿win8的主界面越来越多,在大家见惯了类GridView或者类Tab后,给人一种耳目一新的感觉。今天在eoe上偶然发现已经有人实现了这个功能的源码(地址:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=327557),马上下载跑了一下,效果很炫,但是有些bug,比如点击速度特别快时图像会被放大,以及点击时会触发两次点击事件。

本例子基于eoe中这位大神的实现,做了一些简化,和bug的修复。

效果:

首先普及一个小知识点

我们在项目中有时候需要一个缓慢的梯度数据,例如:控件的宽度以一定的比例增加,然后以相同的比例还原到原来的长度。


package com.zhy._01;
public class Test2
{
 public static void main(String[] args)
 {
 float val = 1; 
 float s = 0.85f;
 int i = 0;
 s = (float) Math.sqrt(1 / s);    System.out.println(val);
 while (i < 5)
 {
 val = val *s ;
 System.out.println(val);
 i++;
 }
 s = 0.85f;
 i = 0;
 s = (float) Math.sqrt(s);
 while (i < 5)
 {
 val = val *s ;
 System.out.println(val);
 i++;
 }
 }
}

 输出结果:

1.0
1.0846523
1.1764706
1.2760615
1.384083
1.5012488
1.384083
1.2760615
1.1764706
1.0846523
1.0

 很完美吧,基本是个对称的梯度数据,梯度的幅度由代码中的s觉得,越接近1幅度越小,反之则反之。

好了下面开始代码:

1、布局文件


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:background="@drawable/bkg_img_default"
 android:gravity="center"
 android:orientation="vertical" >
 <LinearLayout
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:orientation="vertical" >
  <LinearLayout
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="horizontal" >
   <LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <com.ljp.ani01.MyImageView
     android:id="@+id/c_joke"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_margin="2dp"
     android:scaleType="matrix"
     android:class="lazy" data-src="@drawable/left_top" />
    <com.ljp.ani01.MyImageView
     android:id="@+id/c_idea"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_margin="2dp"
     android:scaleType="matrix"
     android:class="lazy" data-src="@drawable/left_bottom" />
   </LinearLayout>
   <com.ljp.ani01.MyImageView
    android:id="@+id/c_constellation"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="2dp"
    android:scaleType="matrix"
    android:class="lazy" data-src="@drawable/right" />
  </LinearLayout>
  <com.ljp.ani01.MyImageView
   android:id="@+id/c_recommend"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_margin="2dp"
   android:scaleType="matrix"
   android:class="lazy" data-src="@drawable/bottom" />
 </LinearLayout>
</LinearLayout>

布局文件,完成了上面效果图的静态效果,如果你不需要添加点击动画,或者只需要很简单的点击效果,那么就已经完成这样的菜单的编写,再添加个backgroud自定义下点击效果就好了。当然,我们这里有个比较柔和的点击动画,有自定义的ImageView完成。

2、MyImageView.java


package com.ljp.ani01;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageView;
public class MyImageView extends ImageView
{
 private static final String TAG = "MyImageView";
 private static final int SCALE_REDUCE_INIT = 0;
 private static final int SCALING = 1;
 private static final int SCALE_ADD_INIT = 6;
 
 private int mWidth;
 
 private int mHeight;
 
 private int mCenterWidth;
 
 private int mCenterHeight;
 
 private float mMinScale = 0.85f;
 
 private boolean isFinish = true;
 public MyImageView(Context context)
 {
 this(context, null);
 }
 public MyImageView(Context context, AttributeSet attrs)
 {
 this(context, attrs, 0);
 }
 public MyImageView(Context context, AttributeSet attrs, int defStyle)
 {
 super(context, attrs, defStyle);
 }
 
 @Override
 protected void onLayout(boolean changed, int left, int top, int right, int bottom)
 {
 super.onLayout(changed, left, top, right, bottom);
 if (changed)
 {
 mWidth = getWidth() - getPaddingLeft() - getPaddingRight();
 mHeight = getHeight() - getPaddingTop() - getPaddingBottom();
 mCenterWidth = mWidth / 2;
 mCenterHeight = mHeight / 2;
 Drawable drawable = getDrawable();
 BitmapDrawable bd = (BitmapDrawable) drawable;
 bd.setAntiAlias(true);
 }
 }
 @Override
 public boolean onTouchEvent(MotionEvent event)
 {
 switch (event.getAction())
 {
 case MotionEvent.ACTION_DOWN:
 float X = event.getX();
 float Y = event.getY();
 mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT);
 break;
 case MotionEvent.ACTION_UP:
 mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT);
 break;
 }
 return true;
 }
 
 private Handler mScaleHandler = new Handler()
 {
 private Matrix matrix = new Matrix();
 private int count = 0;
 private float s;
 
 private boolean isClicked;
 public void handleMessage(android.os.Message msg)
 {
 matrix.set(getImageMatrix());
 switch (msg.what)
 {
 case SCALE_REDUCE_INIT:
 if (!isFinish)
 {
  mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT);
 } else
 {
  isFinish = false;
  count = 0;
  s = (float) Math.sqrt(Math.sqrt(mMinScale));
  beginScale(matrix, s);
  mScaleHandler.sendEmptyMessage(SCALING);
 }
 break;
 case SCALING:
 beginScale(matrix, s);
 if (count < 4)
 {
  mScaleHandler.sendEmptyMessage(SCALING);
 } else
 {
  isFinish = true;
  if (MyImageView.this.mOnViewClickListener != null && !isClicked)
  {
  isClicked = true;
  MyImageView.this.mOnViewClickListener.onViewClick(MyImageView.this);
  } else
  {
  isClicked = false;
  }
 }
 count++;
 break;
 case 6:
 if (!isFinish)
 {
  mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT);
 } else
 {
  isFinish = false;
  count = 0;
  s = (float) Math.sqrt(Math.sqrt(1.0f / mMinScale));
  beginScale(matrix, s);
  mScaleHandler.sendEmptyMessage(SCALING);
 }
 break;
 }
 }
 };
 protected void sleep(int i)
 {
 try
 {
 Thread.sleep(i);
 } catch (InterruptedException e)
 {
 e.printStackTrace();
 }
 }
 
 private synchronized void beginScale(Matrix matrix, float scale)
 {
 matrix.postScale(scale, scale, mCenterWidth, mCenterHeight);
 setImageMatrix(matrix);
 }
 
 private OnViewClickListener mOnViewClickListener;
 public void setOnClickIntent(OnViewClickListener onViewClickListener)
 {
 this.mOnViewClickListener = onViewClickListener;
 }
 public interface OnViewClickListener
 {
 void onViewClick(MyImageView view);
 }
}

代码不算复杂,主要就是对onTouchEvent的Action_Down和Action_Up的监听,然后通过Handler结合matrix完成缩放的效果。这里简单说一个mScaleHandler里面代码的逻辑,当检测到ACTION_DOWN事件,会判断当前缩放是否完成,如果完成了则添加缩小的效果,如果没有,则一直检测。ACTION_UP也是同样的过程。缩放的梯度就用到了文章开始介绍的小知识点。

有人会觉得使用Handler比较麻烦,这里一直使用Handler.sendMsg的原因是,利用了这个消息队列,队列先进先出,保证动画效果的流畅。因为ACTION_DOWN_与ACTION_UP一瞬点完成的,其实动画还在进行。如果你在onTouchEvent中用while集合sleep完成动画,会出现卡死,监听不到Up事件等问题。

3、主Activity


package com.ljp.ani01;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
public class TestRolateAnimActivity extends Activity
{
 MyImageView joke;
 @Override
 public void onCreate(Bundle savedInstanceState)
 {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 joke = (MyImageView) findViewById(R.id.c_joke);
 joke.setOnClickIntent(new MyImageView.OnViewClickListener()
 {
 @Override
 public void onViewClick(MyImageView view)
 {
 Toast.makeText(TestRolateAnimActivity.this, "Joke", 1000).show();
 }
 });
 }
}

利用提供的回调接口注册了点击事件。这里说明一下,现在为ImageView设置OnClickLIstener是没有作用的,因为自定义的ImageView的onTouchEvent直接返回了true,不会往下执行click事件,如果你希望通过OnClickLIstener进行注册,你可以把ontouchevent里面返回值改成super.ontouchevent(event),并且需要将ImageView的clickable设置为true。这些都是Ontouch事件的传播机制,不了解的google下,还是很有必要的。

源码下载:http://xiazai.jb51.net/201608/yuanma/AndroidRolateAnim(jb51.net).rar

您可能感兴趣的文章:详解Android 手机卫士设置向导页面Android自定义手机界面状态栏实例代码Android获取手机通讯录、sim卡联系人及调用拨号界面方法解析Android开发优化之:对界面UI的优化详解(二)解析Android开发优化之:对界面UI的优化详解(一)Android UI手机信息页面设计


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

手机下载了一些APP,发现现在仿win8的主界面越来越多,在大家见惯了类GridView或者类Tab后,给人一种耳目一新的感觉。今天在eoe上偶然发现已经有人实现了这个功能的源码(地址:http://www.eoeandroid.com/f
2022-06-06

Win8怎么关闭metro界面?Win8关闭metro界面的方法

Win8怎么关闭metro界面?升级Win8系统后,多了个metro界面,该界面虽然好看,但是很多Win7用户用得并不习惯。如果电脑没有触控功能,那么关闭metro界面将会更加方便,直接就可以打开桌面的Win8了。那么在Win8系统下要如何
2022-06-04

win8的metro界面怎么取消?

Win8新增的Metro界面是专门为平板电脑所设计的。如果你安装了WIN8,但电脑没有触控功能时,可能更适合没有METRO界面、直接打开桌面的WIN8了,那我们要怎么取消win8的metro界面呢?下面就为大家介绍一下,一起来看下吧! 工具
2022-06-04

Win8下关闭Metro界面程序的方法

win8在10月26日正式和大家见面了,虽然之前发布了预览版和测试版让用户更快速属性win8操作系统,可是还是有的用户还想不习惯win8的Metro界面程序和点触屏的操作。那么在win8系统怎么关闭Metro界面程序呢。对于一些刚接触到wi
2022-06-04

Win8系统Metro界面无法打开怎么办?Win8系统Metro界面无法打开的解决方法

最近有位Win8用户在反映Win8系统Metro界面打不开这是怎么回事呢?其实这可能是因为Windows Search设置了自动(延迟启动)的启动类型造成的,那么遇到这种问题该怎么解决呢?我们只要修改为自动即可。下面小编就给大家带来Win8
2022-06-04

Win8的全新Metro界面入门 灵活登录操控介绍

微软最新发布的Windows 8操作系统正在成为很多人争相体验的炫酷产品,不仅是喜欢WiN8那充满个性化的Metro界面,而且就操作性来说,WiN8电脑更是令人感觉灵活自如、随心所欲,包括PC、笔记本、平板等Win8设备都能带来一致的使用体
2022-06-04

Win8系统取消显示metro界面的方法图文教程

在win8系统上,有个metro界面,方便用户第一时间打开自己常用的工具,但习惯了win7系统的朋友就不太习惯用metro界面,我们可以将其取消删除。1、启动win8后按windows+x键,从弹出菜单中选择“运行”
2022-06-04

Win8系统修改Metro开始界面磁贴(tile)行数的方法

Win8的Metro开始界面将应用的快捷方式以磁贴(tile)的形式显示出来,通过单击磁贴我们可以快速访问应用。默认设置下,系统是根据屏幕的分辨路来显示默认磁贴(tile)的行数。 小编使用的是15寸笔记本,分辨率为1440 X 900
2022-06-04

让Win8的Metro界面开始菜单显示更多的程序的方法

Win8说的最多的就是Metro界面,Metro界面其实也就是Windows系统的开始菜单,可能您看得,听得都有点手指、耳朵带茧了,但是实际上体验过Merto界面的话还是非常新颖有趣的,给人一种全新的体验。不过要想体验的更深入,我们可以将W
2023-06-06

Win8系统Metro界面无法打开的解决方法是什么

这期内容当中小编将会给大家带来有关Win8系统Metro界面无法打开的解决方法是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在win8系统中,出现Metro界面无法打开的情况。这可能是因为Windo
2023-06-28

win8使用鼠标关闭Metro界面下的应用程序方法

操作步骤:鼠标的方法有两种:第一种:移动鼠标至屏幕左上角,会出现打开的安装在Metro界面下程序。在程序上右键单击选择“关闭”即可。第二种:将鼠标移动到当前打开程序的顶端,鼠标的箭头会变为小手。点中鼠标左键后向下拖动
2022-06-04

win8用内置帐号不能使用metro界面里的应用商店

在安装Windows8后的时候默认创建的帐号虽说是隶属于administrator组,但是却并不是拥有administrator的完全权限,所以在非administrator的用户下使用其它帐户的时候,我们通常用win+x来切超级权限。也许
2023-06-04

Windows8系统Metro(Modern UI)界面应用程序安装失败的解决方法

很多同学反应Win8 Metro应用程序经常遇到安装失败的情况,重新安装应用程序也无济于事,总是出现挂起,然后就没有反应了。排除Win8现在还不完善,很大的原因缘于各位同学对Win8进行的优化导致的。安装失败的应用在Modern UI界面上
2022-06-04

Win8系统一键快速关闭Metro界面中的应用程序技巧

随着Win8系统不断地自我改进,深受很多用户的喜爱。但是在使用此系统中,如果打开很多Metro界面中的应用程序,如果想要关闭必须把鼠标指向左上方会弹出一个小窗口按鼠标右键才能一个个关闭,显然这样的操作步骤是非常的麻烦。针对以上问题我们可以按
2023-06-05

Win8开始界面怎么关机?Win8.1系统在Metro界面中创建关机磁贴的方法图解

Win8/8.1加入Metro开始界面后,很多网友在开始界面都不知道怎么关机,每次电脑关机都需要切换到传统桌面。今天,编程网小编教大家一个玩转Win8/8.1关机技巧,在Metro开始界面创建关机磁贴,这样无论是哪个界面,关机都非常简单,下
2022-06-04

Android自定义videoview仿抖音界面的示例分析

这篇文章主要介绍Android自定义videoview仿抖音界面的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用
2023-06-15

解析Android开发优化之:对界面UI的优化详解(一)

通常,在这个页面中会用到很多控件,控件会用到很多的资源。Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等,这些都可以在应用程序中直接使用。这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可
2022-06-06

解析Android开发优化之:对界面UI的优化详解(二)

如果我们在每个xml文件中都把相同的布局都重写一遍,一个是代码冗余,可读性很差;另一个是修改起来比较麻烦,对后期的修改和维护非常不利。所以,一般情况下,我们需要把相同布局的代码单独写成一个模块,然后在用到的时候,可以通过
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录