有使用Twitter客户端的朋友应该有发现在登录的时候,屏幕上方和下方的云朵图片是不断移动着的,再加上Twitter那支可爱的小鸟在不停的动着,给人的感觉就好像是小鸟在飞翔一样,感觉效果很不错。

我也试着实现了一下,发现使用自定义的Drawable加上线程,还是比较容易实现的。下面是自定义Drawable的代码,注释已经写的很详细了。这里是使用了三张图片,使用一张图就更简单了,大家完全可以举一反三,实现自己的动画图片效果。

package com.liuzhichao.dynamicdrawable;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.drawable.Drawable;
import android.util.DisplayMetrics;
import android.view.View; public class DynamicDrawable extends Drawable implements Runnable { private static Bitmap mBottomBgBitmap; //底部大图
private static Bitmap mBottomFgBitmap; // 底部小图
private static Bitmap mTopBitmap; //顶部云图片 private final int dispalyWidth; //手机屏幕宽度
private final int dispalyHeight; //手机屏幕高度
private float mBottomBgTop; //顶部大图显示的位置
private float mBottomFgTop; //顶部小图显示的位置 private int startX; //顶部云图片和底部大图移动偏移变量
private int mBottomFgStartX; //底部小图移动偏移变量
private View mView; public DynamicDrawable(Activity activity, View mView) {
this.mView = mView; if (mTopBitmap == null) {
mTopBitmap = BitmapFactory.decodeResource(activity.getResources(),
R.drawable.cloud_top_bg);
}
if (mBottomBgBitmap == null) {
mBottomBgBitmap = BitmapFactory.decodeResource(
activity.getResources(), R.drawable.cloud_bottom_bg);
}
if (mBottomFgBitmap == null) {
mBottomFgBitmap = BitmapFactory.decodeResource(
activity.getResources(), R.drawable.cloud_bottom_fg);
} //获取屏幕高度和宽度
DisplayMetrics dm = new DisplayMetrics();
dm = activity.getResources().getDisplayMetrics();
this.dispalyHeight = dm.heightPixels;
this.dispalyWidth = dm.widthPixels; //顶部图片显示的位置 = 屏幕高度 - 图片自身高 - 标题高度
this.mBottomBgTop = dispalyHeight - mBottomBgBitmap.getHeight() - 100;
this.mBottomFgTop = dispalyHeight - mBottomFgBitmap.getHeight() - 100; //开始移动图片线程
new Thread(this).start();
} @Override
public void draw(Canvas canvas) {
// drawBitmap (Bitmap bitmap, float left, float top, Paint paint)
canvas.drawBitmap(mTopBitmap, startX, 0, null);
canvas.drawBitmap(mBottomBgBitmap, startX, mBottomBgTop, null);
canvas.drawBitmap(mBottomFgBitmap, mBottomFgStartX, mBottomFgTop, null);
} @Override
public int getOpacity() {
// TODO Auto-generated method stub
return 0;
} @Override
public void setAlpha(int arg0) {
// TODO Auto-generated method stub } @Override
public void setColorFilter(ColorFilter arg0) {
// TODO Auto-generated method stub } @Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
//900 是图片的长度
//如果移动偏量已经大于图片的长度 - 屏幕宽度,则说明已经移动到了图片的末端,如果继续移动,则会显示空白
//所以将startX重新赋予0,让图片重新开始移动
//但是这样过渡效果会比较明显,再切换的那一刹那,会明显感觉图片变化较大
if (startX + (900 - dispalyWidth) == 0) {
startX = 0;
} else {
startX -= 1;
} //底部小图的移动,
// -=2 是让小图移动的比大图快,造成不同的视觉效果
if (mBottomFgStartX + (900 - dispalyWidth) == 0) {
mBottomFgStartX = 0;
} else {
mBottomFgStartX -= 2;
}
try {
//每 1/10秒移动一次
Thread.sleep(100L);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
//刷新界面
mView.postInvalidate();
} } }

然后在需要背景图的地方,直接setBackgroundDrawable就可以了,下面的background是整个布局文件的id。

private View background;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
background = findViewById(android.R.id.background);
background.setBackgroundDrawable(new DynamicDrawable(this, background));
}

布局文件也还是贴出来吧:

<RelativeLayout 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:id="@android:id/background" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:padding="@dimen/padding_medium"
android:text="@string/hello_world"
tools:context=".MainActivity" /> </RelativeLayout>

还是截张图吧,虽然看不到动画效果。

本文转自:http://liuzhichao.com/p/659.html

仿Twitter登陆移动背景效果的更多相关文章

  1. C# 实现简单仿QQ登陆注册功能

    闲来没事,想做一个仿QQ登陆注册的winform,于是利用工作之余,根据自己的掌握和查阅的资料,历时4天修改完成,新手水平,希望和大家共同学习进步,有不同见解希望提出! 废话不多说,进入正题: 先来看 ...

  2. WPF实现Twitter按钮效果

    最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下. 实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.com/css3-twit ...

  3. 浅谈HTML之模仿人人网登陆界面(新手必学)

    为方便大家对web相关知识的了解,现谈谈新手如何从HTML css  Javascript到以后后台的发展.首先,让大家看看HTML仿人人登陆界面: <!doctype html> < ...

  4. WPF实现Twitter按钮效果(转)

    最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下. 实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.com/css3-twit ...

  5. 那些年一起用过的iOS开发利器之Parse

    阅读此文章需要对Objective-C和iOS有一定的了解,完全没有基础的朋友请先阅读<让不懂编程的人爱上iPhone开发>系列教程. 什么是后台服务(back-end service)? ...

  6. 【android design】android常用设计资源

    一.概述 大部分程序员擅长开发,但是对于设计却知之甚少.这直接导致,程序员在初期开发出来的应用(大多为兴趣或实用导向)中看不中用.因此,有必要搜集整合一些设计资源,这样既能减轻程序员在设计上所耗费的时 ...

  7. 50个Android开发人员必备UI效果源码[转载]

    50个Android开发人员必备UI效果源码[转载] http://blog.csdn.net/qq1059458376/article/details/8145497 Android 仿微信之主页面 ...

  8. duilib修复ActiveXUI控件bug,以支持flash透明动态背景

    转载请说明原出处,谢谢~~ 昨天在QQ控件里和同学说起QQ2013登陆窗体的开发,从界面角度考虑,单单一个登陆界面是很容易做出来的.腾讯公司为了 防止各种盗号行为可谓煞费苦心,QQ2013采用了动态背 ...

  9. [转载] 50个Android开发人员必备UI效果源码

    好东西,多学习! Android 仿微信之主页面实现篇Android 仿微信之界面导航篇Android 高仿QQ 好友分组列表Android 高仿QQ 界面滑动效果Android 高仿QQ 登陆界面A ...

随机推荐

  1. asp.net中Literal与label的区别

    Literal 控件表示用于向页面添加内容的几个选项之一.对于静态内容,无需使用容器,可以将标记作为 HTML 直接添加到页面中.但是,如果要动态添加内容,则必须将内容添加到容器中.典型的容器有 La ...

  2. 540B :School Marks

    题目链接 题意: 输入: 第一个: n k p x y 第二行:k个数 n: 数的数量 k:n个数中已经知道的k个数 p:n个数取值的上界,下界是1 x:n个数的和的上界x y:n个数的中位数至少是 ...

  3. 关于SIGPIPE导致的程序退出

    http://www.cppblog.com/elva/archive/2008/09/10/61544.html 收集一些网上的资料,以便参考: http://blog.chinaunix.net/ ...

  4. 跨浏览器兼容的HTML5视频音频播放器

    HTML5的video和audio标签是用来在网页中加入视频和音频的标签,在支持html5的浏览器中不需要预先加载Adobe Flash浏览器插件就能轻松快速的播放视频和音频文件.而html5medi ...

  5. C语言:几种字符输入函数的区别

    几种字符输入函数的区别: 1.getche()函数:用于从键盘读入一个字符并显示,然后直接执行下一条语   句. 2.getch()函数:用于从键盘中读入一个字符,但不显示在屏幕上,       然后 ...

  6. 练习用php做表格

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. Spring事务的来龙去脉

    引言 Spring是一个IOC框架,在IOC框架的基础上,提供了DAO集成,AOP事务控制,JNDI等等一系列的高级功能,个人觉得,在Spring中最值得称道的不仅仅它是一个非入侵的IOC容器,而在于 ...

  8. Linux下安装Python-3.3.2【转】

    # 下载最新版本 cd /usr/local/src/ sudo wget http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.bz2 su ...

  9. XTU -1231 人生成就 (dp + 记录最优解的个数)

    http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1231 直接递推. 在保存最大值的时候同时保存有多少条到达最大值的路径,注意 ...

  10. leetcode:Multiply Strings

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...