热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android编程实现仿iphone抖动效果的方法(附源码)

这篇文章主要介绍了Android编程实现仿iphone抖动效果的方法,结合实例形式分析了仿iphone抖动效果的页面布局及功能实现技巧,并附带实例源码供读者下载,需要的朋友可以参考下

本文实例讲述了Android编程实现仿iphone抖动效果的方法。分享给大家供大家参考,具体如下:

布局文件:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
  
  
  
  
 
 
  
  
  
  
 
 
  
  
  
  
 
 
  
  
  
  
 
 
  
  
  
  
 


代码:

package com.android.shake;
import android.app.Activity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.RotateAnimation;
import android.widget.TextView;
import android.view.View;
import android.view.Window;
public class ShakeTestActivity extends Activity implements View.OnClickListener {
 private TextView mtv0;
 private TextView mtv1;
 private TextView mtv2;
 private TextView mtv3;
 private TextView mtv4;
 private TextView mtv5;
 private TextView mtv6;
 private TextView mtv7;
 private TextView mtv8;
 private TextView mtv9;
 private TextView mtv10;
 private TextView mtv11;
 private TextView mtv12;
 private TextView mtv13;
 private TextView mtv14;
 private TextView mtv15;
 private TextView mtv16;
 private TextView mtv17;
 private TextView mtv18;
 private TextView mtv19;
 private boolean mNeedShake = false;
 private boolean mStartShake = false;
 private static final int ICON_WIDTH = 80;
 private static final int ICON_HEIGHT = 94;
 private static final float DEGREE_0 = 1.8f;
 private static final float DEGREE_1 = -2.0f;
 private static final float DEGREE_2 = 2.0f;
 private static final float DEGREE_3 = -1.5f;
 private static final float DEGREE_4 = 1.5f;
 private static final int ANIMATION_DURATION = 80;
 private int mCount = 0;
 float mDensity;
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.main);
  DisplayMetrics dm = new DisplayMetrics();
  getWindowManager().getDefaultDisplay().getMetrics(dm);
  if (dm != null) {
   mDensity = dm.density;
  }
  mtv0 = (TextView) findViewById(R.id.tv0);
  mtv0.setOnClickListener(this);
  mtv1 = (TextView) findViewById(R.id.tv1);
  mtv1.setOnClickListener(this);
  mtv2 = (TextView) findViewById(R.id.tv2);
  mtv2.setOnClickListener(this);
  mtv3 = (TextView) findViewById(R.id.tv3);
  mtv3.setOnClickListener(this);
  mtv4 = (TextView) findViewById(R.id.tv4);
  mtv4.setOnClickListener(this);
  mtv5 = (TextView) findViewById(R.id.tv5);
  mtv5.setOnClickListener(this);
  mtv6 = (TextView) findViewById(R.id.tv6);
  mtv6.setOnClickListener(this);
  mtv7 = (TextView) findViewById(R.id.tv7);
  mtv7.setOnClickListener(this);
  mtv8 = (TextView) findViewById(R.id.tv8);
  mtv8.setOnClickListener(this);
  mtv9 = (TextView) findViewById(R.id.tv9);
  mtv9.setOnClickListener(this);
  mtv10 = (TextView) findViewById(R.id.tv10);
  mtv10.setOnClickListener(this);
  mtv11 = (TextView) findViewById(R.id.tv11);
  mtv11.setOnClickListener(this);
  mtv12 = (TextView) findViewById(R.id.tv12);
  mtv12.setOnClickListener(this);
  mtv13 = (TextView) findViewById(R.id.tv13);
  mtv13.setOnClickListener(this);
  mtv14 = (TextView) findViewById(R.id.tv14);
  mtv14.setOnClickListener(this);
  mtv15 = (TextView) findViewById(R.id.tv15);
  mtv15.setOnClickListener(this);
  mtv16 = (TextView) findViewById(R.id.tv16);
  mtv16.setOnClickListener(this);
  mtv17 = (TextView) findViewById(R.id.tv17);
  mtv17.setOnClickListener(this);
  mtv18 = (TextView) findViewById(R.id.tv18);
  mtv18.setOnClickListener(this);
  mtv19 = (TextView) findViewById(R.id.tv19);
  mtv19.setOnClickListener(this);
 }
 @Override
 public void onClick(View v) {
  if (!mStartShake) {
   mStartShake = true;
   mNeedShake = true;
   shakeAnimation(mtv0);
   shakeAnimation(mtv1);
   shakeAnimation(mtv2);
   shakeAnimation(mtv3);
   shakeAnimation(mtv4);
   shakeAnimation(mtv5);
   shakeAnimation(mtv6);
   shakeAnimation(mtv7);
   shakeAnimation(mtv8);
   shakeAnimation(mtv9);
   shakeAnimation(mtv10);
   shakeAnimation(mtv11);
   shakeAnimation(mtv12);
   shakeAnimation(mtv13);
   shakeAnimation(mtv14);
   shakeAnimation(mtv15);
   shakeAnimation(mtv16);
   shakeAnimation(mtv17);
   shakeAnimation(mtv18);
   shakeAnimation(mtv19);
  }
 }
 private void shakeAnimation(final View v) {
  float rotate = 0;
  int c = mCount++ % 5;
  if (c == 0) {
   rotate = DEGREE_0;
  } else if (c == 1) {
   rotate = DEGREE_1;
  } else if (c == 2) {
   rotate = DEGREE_2;
  } else if (c == 3) {
   rotate = DEGREE_3;
  } else {
   rotate = DEGREE_4;
  }
  final RotateAnimation mra = new RotateAnimation(rotate, -rotate, ICON_WIDTH * mDensity / 2, ICON_HEIGHT * mDensity / 2);
  final RotateAnimation mrb = new RotateAnimation(-rotate, rotate, ICON_WIDTH * mDensity / 2, ICON_HEIGHT * mDensity / 2);
  mra.setDuration(ANIMATION_DURATION);
  mrb.setDuration(ANIMATION_DURATION);
  mra.setAnimationListener(new AnimationListener() {
   @Override
   public void onAnimationEnd(Animation animation) {
    if (mNeedShake) {
     mra.reset();
     v.startAnimation(mrb);
    }
   }
   @Override
   public void onAnimationRepeat(Animation animation) {
   }
   @Override
   public void onAnimationStart(Animation animation) {
   }
  });
  mrb.setAnimationListener(new AnimationListener() {
   @Override
   public void onAnimationEnd(Animation animation) {
    if (mNeedShake) {
     mrb.reset();
     v.startAnimation(mra);
    }
   }
   @Override
   public void onAnimationRepeat(Animation animation) {
   }
   @Override
   public void onAnimationStart(Animation animation) {
   }
  });
  v.startAnimation(mra);
 }
 @Override
 public void onBackPressed() {
  if (!mNeedShake) {
   super.onBackPressed();
  } else {
   mNeedShake = false;
   mCount = 0;
   mStartShake = false;
  }
 }
}

完整实例代码代码点击此处本站下载。

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 优化 Android 按钮状态下的背景和文本颜色变化
    本文介绍如何通过 Android 的 Selector 实现按钮在不同状态下(如按压)的背景和文本颜色动态变化。我们将详细讲解实现步骤,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
  • 本文介绍了如何通过设置背景形状来轻松地为 Android 的 TextView 添加圆形边框。我们将详细讲解 XML 代码的配置,包括圆角、描边和填充等属性。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
  • 本文将带您了解Cocos家族的不同版本和分支,特别是Cocos Creator的发展历程及其核心特性,帮助初学者快速入门。 ... [详细]
  • 三星Galaxy S8/S8+即将登场,全面解析新旗舰
    3月29日晚11点,备受瞩目的三星Galaxy S8/S8+将正式发布。作为三星在Note 7爆炸事件后的重磅产品,S8/S8+不仅承载着恢复消费者信心的重任,其创新的设计和技术也备受期待。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 探讨 iPhone 12 mini 在正常使用时屏幕突然变暗的现象,分析其可能的成因及解决方案。 ... [详细]
author-avatar
逗趣游戏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有