【安卓笔记】仿乐安全首页动态效果

先看效果:

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    tools:context=".MainActivity" >
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/homepage_disk_button_orange_normal" />
        <ImageView
            android:id="@+id/iv_rotate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:src="@drawable/homepage_disk_orange_normal" />
        <com.example.view.RadiationView
            android:id="@+id/rv"
            android:layout_width="250dp"
            android:layout_height="250dp"
            android:layout_gravity="center" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="SB"
            android:textColor="#ffffff"
            android:textSize="30sp" />
    </FrameLayout>
</LinearLayout>

旋转动画:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="12000"
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:startOffset="0"
    android:interpolator="@android:anim/linear_interpolator"
    android:repeatCount="infinite"
    android:repeatMode="restart"
    android:toDegrees="360" />

带辐射效果的view:

package com.example.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
 * @author Rowandjj
 *
 *带辐射效果的view
 */
public class RadiationView extends View
{
	/**
	 *画笔
	 */
	private Paint mPaint = new Paint();

	/**
	 *颜色
	 */
	private int mColor = 0x3f990e;

	/**
	 * 透明度
	 */
	private int mAlpha = 60;

	private Handler mHandler = null;

	private static final int MESSAGE_DRAW = 0;
	private static final String TAG = "RadiationView";

	private int width;
	private int height;

	/**
	 * 扩散速度
	 */
	private int speed = 30;
	/**
	 *最大辐射半径
	 */
	private int maxRadius = 100;

	private int centerX;
	private int centerY;

	/**
	 * 最小半径
	 */
	private int minRadius = 70;
	/**
	 * 当前半径
	 */
	private int radius = minRadius;

	private boolean isStarted = false;

	public RadiationView(Context context)
	{
		super(context);
		init();
	}
	public RadiationView(Context context, AttributeSet attrs)
	{
		super(context, attrs, 0);
		init();
	}
	public void startRadiate()
	{
		isStarted = true;
		mHandler.sendEmptyMessage(MESSAGE_DRAW);
	}

	private void init()
	{
		mPaint = new Paint();
		mPaint.setStrokeWidth(1);
		//必须先设置color,再设置alpha
		mPaint.setColor(mColor);
		mPaint.setAlpha(mAlpha);

		mHandler = new Handler()
		{
			public void handleMessage(android.os.Message msg)
			{
				if(msg.what == MESSAGE_DRAW)
				{
					invalidate();
					if(isStarted)
					{
						sendEmptyMessageDelayed(MESSAGE_DRAW,speed);
					}
				}
			}
		};
	}

	@Override
	protected void onLayout(boolean changed, int left, int top, int right,
			int bottom)
	{
		super.onLayout(changed, left, top, right, bottom);
		width = this.getWidth();
		height = this.getHeight();
		if(width <= 0 || height<=0)
		{
			throw new RuntimeException("size illegal");
		}
		//中心点
		centerX = width/2;
	    centerY = height/2;
		//最大辐射半径
		maxRadius = (width > height) ? height/2 : width/2;
		Log.i(TAG,"MAX"+maxRadius);
		if(maxRadius < 70)
		{
			throw new RuntimeException("size too small");
		}
	}
	@Override
	protected void onDraw(Canvas canvas)
	{
		mPaint.setColor(mColor);
		mPaint.setAlpha(mAlpha);
		if(radius <= 0)
		{
			return;
		}
		if(radius > maxRadius)
		{
			radius = minRadius;
		}
		canvas.save();
		canvas.drawCircle(centerX, centerY, radius, mPaint);
		canvas.restore();
		radius += 1;
	}
	@Override
	protected void onAttachedToWindow()
	{
		super.onAttachedToWindow();
		this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
	}

	public void setColor(int color)
	{
		this.mColor = color;
	}

	public void setSpeed(int speed)
	{
		this.speed = speed;
	}

	public void setMinRadius(int radius)
	{
		this.minRadius = radius;
	}
}

调用的代码:

package com.example.animdemo1;
import android.app.Activity;
import android.os.Bundle;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import com.example.view.RadiationView;
public class MainActivity extends Activity
{
	private ImageView iv = null;
	private RadiationView rv = null;
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		iv = (ImageView) findViewById(R.id.iv_rotate);
		rv = (RadiationView) findViewById(R.id.rv);
		rv.setMinRadius(70);//辐射半径
		rv.startRadiate();//开始辐射
		Animation anim = AnimationUtils.loadAnimation(this, R.anim.rotate_circle_anim);
		iv.startAnimation(anim);//开始动画
	}
}
时间: 2024-11-11 20:34:38

【安卓笔记】仿乐安全首页动态效果的相关文章

【iOS开发每日小笔记(三)】利用iOS7 UIKit Dynamics 仿Zaker客户端首页动态效果

这篇文章是我的[iOS开发每日小笔记]系列中的一片,记录的是今天在开发工作中遇到的,可以用很短的文章或很小的demo演示解释出来的小心得小技巧.该分类的文章,内容涉及的知识点可能是很简单的.或是用很短代码片段就能实现的,但在我看来它们可能会给用户体验.代码效率得到一些提升,或是之前自己没有接触过的技术,很开心的学到了,放在这里得瑟一下(^_^).其实,90%的作用是帮助自己回顾.记忆.复习.如果看官觉得太easy,太碎片,则可以有两个选择:1,移步[iOS探究]分类,对那里的文章进行斧正:2,在

【安卓笔记】仿猎豹清理大师波浪效果

先来看效果: 实现方式----->自定义控件 核心代码: package com.example.wavedemo1; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.os.Handler; import

Xamrin开发安卓笔记(三)

安装片 Xamrin开发安卓笔记(一) Xamrin开发安卓笔记(二) 这次记录的是滚动条跟sqlite创建.存储和读取. 先说滚动条相关,这个是比较简单的知识点. 当有一屏的东西需要填写的时候例如下图 我们都知道如果点击第一个文本框则会出现输入法.但是如果没有滚动条的话,只能依靠输入法中的回车一个一个的向下移动(虽然现在输入法都带自我关闭功能),很不友好,那么就需要滚动条,看了一下布局属性有滚动条,但是使用起来不好使.隐约想起来,安卓有滚动条控件,就在左边找了一下,果真找到这个玩意了.如下图

【安卓笔记】抽屉式布局----DrawerLayout

效果如下: DrawerLayout来自support.v4包,所以不用考虑兼容性问题.其次,这种布局类似风靡一时的侧滑菜单,但是比侧滑菜单轻巧许多. 下面介绍这种布局的使用方式. 1.在你的项目中导入support.v4包. 2.编辑一个布局,根节点为android.support.v4.widget.DrawerLayout,此节点下只允许有两个子节点,第一个为将来主页面的内容,第二个节点即为"抽屉"内容,通常是一个ListView.比如: <android.support.

【安卓笔记】通过发送特定的短信远程控制手机

实现效果: 1.发送指令#*location*#,可以远程获取到手机的地理位置(经纬度),并以短信的形式返回. 2.发送指令#*locknow*#,可以远程锁屏并设置锁屏密码. 实现原理: 1.注册广播接受者,监听手机收到的短信,并对符合要求的特定短信进行拦截和处理. 2.通过LocationManager获取地理位置. 3.使用DevicePolicyManager实现锁屏.设置锁屏密码等操作. 步骤: 1.创建一个可以获取地理位置的工具类: package cn.edu.chd.mobile

JS学习笔记--仿手机发送内容交互

学习JS笔记----记录上课中学习的知识点,分享下老师教的内容: 1.html内容 <div id="box"> <div id="message"> <!--<p class="left"> <img src="img/136.jpg" /> <span>这是第一句话</span> </p> <p class="righ

Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在ViewPager中添加多张网络请求图片的情况下,不能进行复用,导致每次都要重新去求情已经请求过的数据致使流量数据过大 自定义的数据结构解决了这个问题,固定传递的图片数据之后进行统一请求,完成后进行页面切换数据复用 代码中涉及网络请求是用的Volley网络请求框架 PicCarousel是网络数据请求的U

[安卓开源]仿腾讯通讯录管理

[安卓开源]仿腾讯通讯录管理 功能分类:工具       支持平台:Android      运行环境:Android 开发语言:Java      开发工具:Eclipse        源码大小:1.09MB 下载地址:http://sina.lt/z6f 源码简介 一款基于Android的高仿应用--仿腾讯通讯录管理,供大家学习使用. 源码运行截图

【安卓笔记】在拨号界面通过拨打指定号码来启动某个秘密界面

方案说明: 1.通过注册广播接收者监听用户拨打电话操作: 2.当用户拨打电话时,广播接收者接收到号码,并与指定的"暗号"对比,若匹配,则启动某个界面并且终止用户拨打电话操作. 实现: 1.在清单文件中配置广播接收者,并添加权限: <receiver android:name="cn.edu.chd.mobilesafe.receiver.CallPhoneReceiver" > <intent-filter android:priority=&qu