前段时间产品那边让我做一个动画,要求是先以横线的方式横向展开,在纵向展示图片,最后展示几秒动画在原路返回,随后我在网上查找资料,发现这方面的记录很少,最后自己写了一个

后期还会慢慢改进;

转载请说明出处:http://www.cnblogs.com/hyylog/p/5659619.html

步骤:1、先利用控件的ondraw()方法,结合数字上升的动画,实现划线的步骤;

2、利用postInvalidate()方法,调用dispatchDraw()方法来展示图片的展现

具体代码如下:

public class ExpandView extends LinearLayout {

private Bitmap mBitmap;
private int linearDuration = 500;
private int expandDuration = 800;
private int dismissDuration = 1500;
private Paint mpPaint;
private Paint bitPaint;
private int resultLinear = 40; // 划线动画执行距离完成启动下一个动画的距离 (为防止动画启动延迟产生的卡顿)
private int resultBitMap = 30; // 画图动画距离启动下次动画的距离 (为防止动画启动延迟产生的卡顿)
private int type = 1; // 1 为展开动画 2 为回缩动画
private ValueAnimator valueAnimator = null;
private ValueAnimator valueAnimator2 = null;
private int radus = 8;
private int velua = 0;
private int veluaLinear = 0;
private View view;
private boolean isStart = false; // 保证动画只启动一次
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
velua = 0;
invalidate();
break;
case 1:
start(2);
break;
default:
break;
}
};
};

public ExpandView(Context context, AttributeSet attrs) {
super(context, attrs);
inite();
}

public void setView(View view) {
this.view = view;
}

public ExpandView(Context context) {
super(context);
inite();
}

public void inite() {
bitPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mpPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mpPaint.setStrokeWidth(5);
mpPaint.setColor(Color.BLACK);
}

public void setRadus(int radus) {
this.radus = radus;
}

public void setDistance(int linear, int bit) {
resultBitMap = bit;
resultLinear = linear;
}

public void setDuration(int linearDuration, int expandDuration,
int dismissDuration) {
this.linearDuration = linearDuration;
this.expandDuration = expandDuration;
this.dismissDuration = dismissDuration;
}

public void setLinearPaintColor(int color) {
mpPaint.setColor(color);
}

public void start(int type) {
this.type = type;
valueAnimator.cancel();
valueAnimator2.cancel();
handler.removeMessages(1);
handler.sendEmptyMessage(0);
isStart = true;
if (type == 1) {
valueAnimator.start();
} else if (type == 2) {
valueAnimator2.start();
}
}

public void initedAnimation() {
clearAnimations();
mBitmap = getBitmap();
Log.i("", "pppp====veluaLinear=>>"+(mBitmap.getWidth() - radus * 2));
valueAnimator = ValueAnimator.ofInt(0, mBitmap.getWidth() - radus * 2);
valueAnimator2 = ValueAnimator.ofInt(0, mBitmap.getHeight());
valueAnimator.setDuration(linearDuration);
valueAnimator2.setDuration(expandDuration);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {

@Override
public void onAnimationUpdate(ValueAnimator animation) {
veluaLinear = (Integer) animation.getAnimatedValue();
if (veluaLinear > (mBitmap.getWidth() - resultLinear)&& type == 1) {
if (isStart) {
valueAnimator2.start();
isStart = false;
}
}
postInvalidate();
}
});

valueAnimator2.addUpdateListener(new AnimatorUpdateListener() {

@Override
public void onAnimationUpdate(ValueAnimator animation) {
velua = (Integer) animation.getAnimatedValue();
postInvalidate();
veluaLinear = 0;
}
});
}

@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (mBitmap != null) {
Rect src;
Rect des;
if (type == 1) {
canvas.drawLine(mBitmap.getWidth() - radus, 0,mBitmap.getWidth() - radus - veluaLinear, 0,mpPaint);
src = new Rect(0, 0, mBitmap.getWidth(), velua);
des = new Rect(0, 0, mBitmap.getWidth(), velua);
} else {
canvas.drawLine(mBitmap.getWidth() - radus, 0, radus+ veluaLinear, 0, mpPaint);
src = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()- velua);
des = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()- velua);
}
canvas.drawBitmap(mBitmap, src, des, bitPaint);
if (velua == mBitmap.getHeight() && type == 1) {
handler.removeMessages(1);
handler.sendEmptyMessageDelayed(1, dismissDuration);
}
if (type == 2 && velua >= mBitmap.getHeight() - resultBitMap) {
if (isStart) {
valueAnimator.start();
isStart = false;
}
}
}
}

public void clearAnimations() {
if (valueAnimator != null)
valueAnimator.cancel();
if (valueAnimator2 != null)
valueAnimator.cancel();
handler.removeMessages(1);
veluaLinear=0;
handler.sendEmptyMessage(0);
if (mBitmap != null && !mBitmap.isRecycled()) {
mBitmap.recycle();
}

}

private Bitmap getBitmap() {
// 打开图像缓存
view.setDrawingCacheEnabled(true);
// 必须调用measure和layout方法才能成功保存可视组件的截图到png图像文件
// 测量View大小
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
// 发送位置和尺寸到View及其所有的子View
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
Bitmap bitmap = view.getDrawingCache();
android.widget.FrameLayout.LayoutParams params = (android.widget.FrameLayout.LayoutParams) getLayoutParams();
params.width=bitmap.getWidth();
params.height=bitmap.getHeight();
setLayoutParams(params);
return bitmap;
}
}

Android实现先横向横线展现在纵向拉开图片的更多相关文章

  1. Android TextView使用HTML处理字体样式、显示图片等

    一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操 ...

  2. 转载:Android调用相册、拍照实现缩放、切割图片

    好几天没有写博客了,感觉都有点懈怠了.笔者参加了大学生第二届软件设计大赛,这几天 一直在弄大赛的事情,没有花些时间来整理博客.好在经过一些时日比赛的东西也弄得差不多了, 接下来就是将这段时间学习里面有 ...

  3. Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...

  4. [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现

    [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现 今天做Android项目的时候要用到图片选择,要实现拍照获取图片和从相册获取图片,并且要求在获取完之后可以裁剪,试了很多方法之 ...

  5. Android基础新手教程——1.6 .9(九妹)图片怎么玩

    Android基础新手教程--1.6 .9(九妹)图片怎么玩 标签(空格分隔): Android基础新手教程 1.本节引言: 可能有的一些疑问: 1.什么是.9图片? 答:图片后缀名前有.9的图片,如 ...

  6. [Android] 给图像加入相框、圆形圆角显示图片、图像合成知识

        前一篇文章讲述了Android触屏setOnTouchListener实现突破缩放.移动.绘制和加入水印,继续我的"随手拍"项目完毕给图片加入相框.圆形圆角显示图片和图像合 ...

  7. Android零基础入门第49节:AdapterViewFlipper图片轮播

    原文:Android零基础入门第49节:AdapterViewFlipper图片轮播 上一期学习了ExpandableListView的使用,你已经掌握了吗?本期开始学习AdapterViewFilp ...

  8. Android 自己定义ScrollView ListView 体验各种纵向滑动的需求

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38950509.本文出自[张鸿洋的博客] 1.概述 群里的一个哥们有个需求是这种: ...

  9. Android开发学习——画横线竖线

    画横线/竖线 竖线 <View android:layout_width="1dp" android:layout_height="match_parent&quo ...

随机推荐

  1. Struts2 JSP中将list,set ,Map传递到Action然后遍历(三十五) - 雲淡風輕 - ITeye技术网站

    1.使用Strut2的的集合对象:在jsp初始化action中的list然后提交到action2.使用Struts标签,实现多个用户同时注册(注意属性配置文件)3.pojo package com.s ...

  2. Cocos2dx 学习笔记整理----第一个项目

    接上一节, 进入新建的项目下面的proj.win32下面,找到项目名.sln文件(我的是game001.sln),双击会通过VS2010打开.(当然,你装了VS什么版本就是什么版本) 将你的项目设为启 ...

  3. openstack controller ha测试环境搭建记录(九)——配置nova(计算节点)

    编辑所有节点的/etc/hosts:10.0.0.14 controller110.0.0.12 controller210.0.0.13 controller310.0.0.10 myvip10.0 ...

  4. CodeForces 621C Wet Shark and Flowers

    方法可以转化一下,先计算每一个鲨鱼在自己范围内的数能被所给素数整除的个数有几个,从而得到能被整除的概率,设为f1,不能被整除的概率设为f2. 然后计算每相邻两只鲨鱼能获得钱的期望概率,f=w[id1] ...

  5. NMEA协议 上位机 C# (转)

    源:NMEA协议 上位机 c# 前些时间写做了两款用NMEA协议的上位机,在这里做一个总结和记录.和大家分享,也为了以后不会忘记. NMEA协议总体来说,相对简单,是气象上比较成熟的协议. 主要有以下 ...

  6. 51nod算法马拉松 contest7

    A题 链接:http://www.51nod.com/contest/problem.html#!problemId=1417 推荐链接:http://blog.csdn.net/a837199685 ...

  7. MySQL远程登陆错误

    远程连接 mySql数据库会提示10061.1045错误或 2003-Can’t connect to MySQL on ’192.168.1.2’(10061),这个原因是因为MySQL不准许远程连 ...

  8. PageRank——Google的民主表决算法

    1.搜索和民主表决:      当大多数人认为一件事为真的时候,那么这件事就是为真:即搜索时,其他网页对认为此网页好时,那么此网页排名应该靠前   2.PageRank思想:      i.起源:   ...

  9. LPC1768的iic通讯

    LPC1768有三路IIC,其中IIC0支持高速模式和plus模式,另外两路是普通IIC,使用IIC的过程如下 首先依然是打开IIC时钟,同时打开GPIO时钟 然后配置引脚为IIC功能 另外,因为ii ...

  10. jquey插件开发

    1.概述 jquery插件开发的主要方法有三种: 1.通过$.extend()来扩展jQuery,即在jQuery命名空间下扩展属性,直接在$对象下调用,不需要再dom下调用,也无法在dom元素下调用 ...