Android实现先横向横线展现在纵向拉开图片

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

后期还会慢慢改进;

转载请说明出处: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;
}
}

时间: 2024-11-12 16:10:00

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

android 单行gridview横向滑动的实现

android 单行gridview横向滑动的实现 首先重写下GridView HorizontalGridView.java public class HorizontalGridView extends GridView { public HorizontalGridView(Context context, AttributeSet attrs) { super(context, attrs); } public HorizontalGridView(Context context) {

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载) POSTED ON 2014年6月27日 BY 天边的星星 本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击.浏览时item背景会变色,并解决了listview里setSelected造成item的选择状态混乱的问题.

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

一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操作来演示一下. //创建一个 SpannableString对象 SpannableString msp = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x1x2电话邮件网站短信彩信地图X轴综合"); //设置字体(defau

Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解

本篇文章继续为大家介绍Universal-Image-Loader这个开源的图片加载框架,介绍的是图片缓存策略方面的,如果大家对这个开源框架的使用还不了解,大家可以看看我之前写的一篇文章Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用,我们一般去加载大量的图片的时候,都会做缓存策略,缓存又分为内存缓存和硬盘缓存,我之前也写了几篇异步加载大量图片的文章,使用的内存缓存是LruCache这个类,LRU是Least Recently Used 近

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

    前一篇文章讲述了Android触屏setOnTouchListener实现突破缩放.移动.绘制和添加水印,继续我的"随手拍"项目完成给图片添加相框.圆形圆角显示图片和图像合成的功能介绍.希望文章对大家有所帮助. 一. 打开图片和显示assets文件中图片 首先,对XML中activity_main.xml进行布局,通过使用RelativeLayout相对布局完成(XML代码后面附).然后,在Mainctivity.java中public class MainActivity e

Android新浪微博客户端(七)——ListView中的图片异步加载、缓存

原文出自:方杰|http://fangjie.sinaapp.com/?p=193转载请注明出处 最终效果演示:http://fangjie.sinaapp.com/?page_id=54该项目代码已经放到github:https://github.com/JayFang1993/SinaWeibo 一.ListView的图片异步加载 我们都知道对每一个Weibo Item都有用户头像,而且每一条微博还可能带有图片.如果在加载列表的同时加载图片,这样有几个缺点,第一很费事,界面卡住,用户体验很不

Android基础入门教程——1.6 .9(九妹)图片怎么玩

Android基础入门教程--1.6 .9(九妹)图片怎么玩 标签(空格分隔): Android基础入门教程 1.本节引言: 可能有的一些疑问: 1.什么是.9图片? 答:图片后缀名前有.9的图片,如pic1.9.png这样的图片 2. .9图片能干嘛? 答: 在图片拉伸的时候特定的区域不会发生图片失真,而不失真的区域可以由我们自己绘制 3. .9图片用什么做? 答:工欲善其事,必先利其器,做.9图片的工具有: ①Android SDK自带:draw9patch.bat,不过这玩意出了好久,谷歌

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

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图片,简单介绍了下Matrix:具体请参考:Android 手势检测实战 打造支持缩放平移的图片预览效果(上):本篇继续完善我们的ImageView~~ 首先加入放大后的移动~~ 1.自由的进行移动 我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以移动~~~ @Ov

Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)

※效果 ※使用到的开源库 PhotoView 图片缩放:支持双击缩放,手指捏拉缩放 https://github.com/chrisbanes/PhotoView Universalimageloader 图片下载缓存库 https://github.com/nostra13/Android-Universal-Image-Loader ViewPagerIndicator 分页指示器 https://github.com/JakeWharton/Android-ViewPagerIndicat