实现仿知乎的开场动画,图片zoomin的效果,实现原理,没加动效

package com.carbs.testandroidimage; import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; public class MainActivity extends Activity implements View.OnClickListener { private ImageView iv;
private Button bt1_refine;
private Button bt2_zoomin; private int iv_height = 0;
private int iv_width = 0;
private int dr_height = 0;
private int dr_width = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout. activity_main); iv = (ImageView) this.findViewById(R.id.iv);
bt1_refine = (Button) this.findViewById(R.id.bt1);
bt2_zoomin = (Button) this.findViewById(R.id.bt2); bt1_refine.setOnClickListener(this);
bt2_zoomin.setOnClickListener(this); iv.post( new Runnable() { @Override
public void run() {
//获取imageview的宽和高、获取drawable的宽和高
Drawable d = iv.getDrawable();
//drawable的宽高,存储到全局变量中
dr_width = d.getIntrinsicWidth();
dr_height = d.getIntrinsicHeight();
//imageview的宽高,存储到全局变量中
iv_height = iv .getMeasuredHeight();
iv_width = iv.getMeasuredWidth();
Log. d("a", "onClick() --> dr_width is " + dr_width + " | dr_height is " + dr_height + " | iv_height is " + iv_height + " | iv_width is " + iv_width);
}
});
} @Override
public void onClick(View v) { switch (v.getId()) { case R.id.bt1 : if((iv_height * dr_width > dr_height * iv_width)){
//如果iv更细高,也就是我们需要调整其中图片的高度,使其高度和imageview的高度一致,这样算出scale后,使drawable的宽高同时放大scale倍。由于matrix模式下,调整scale后imageview显示图片依然是从左上角开始显示的,因此需要调整imageview的左右平移,使显示的drawable正好位于正中间。另一种情况(如果iv更宽扁)同理
//计算出高度需要放大多少倍
float scale1 = ((float)iv_height )/((float)dr_height);
//计算出左右平移多少
float offset1 = (dr_width *scale1 - (float)iv_width )/2;
Log. d("1223", "offset1 is " + offset1); Matrix matrix1 = new Matrix();
matrix1.postScale(scale1, scale1);
matrix1.postTranslate(-offset1, 0);
iv.setImageMatrix(matrix1); } else{
//如果iv更宽扁,同理
float scale2 = ((float)iv_width )/((float)dr_width); float offset2 = (dr_height *scale2 - (float)iv_height )/2;
Log. d("1223", "offset2 is " + offset2);
//产生新的大小但Bitmap对象
Matrix matrix2 = new Matrix();
matrix2.postScale(scale2, scale2);
matrix2.postTranslate(0, -offset2);
iv.setImageMatrix(matrix2);
} break; case R.id.bt2 : Matrix ma = iv.getImageMatrix(); float[] dValues = new float[9]; ma.getValues(dValues); dValues[0] = dValues[0] + 0.1f;
dValues[4] = dValues[4] + 0.1f; float offsetheight = (dr_height *dValues[0] - (float)iv_height )/2;
dValues[5] = - offsetheight;
float offsetwidth = (dr_width *dValues[0] - (float)iv_width )/2;
dValues[2] = - offsetwidth; Matrix m = new Matrix();
m.setValues(dValues); iv.setImageMatrix(m);
break;
}
} public String printMyMatrix(Matrix m){
String s = "";
float[] valueFloat = new float[9];
m.getValues(valueFloat); for(int i = 0; i < 9; i++){
s = s + " [ " + valueFloat[i] + " ] " ;
} return s;
} }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width= "match_parent"
android:layout_height= "match_parent"
android:gravity= "center_horizontal"
android:orientation= "vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop= "@dimen/activity_vertical_margin" > <ImageView
android:id="@+id/iv"
android:layout_width="1200px"
android:layout_height="700px"
android:background="@drawable/background_stroke"
android:scaleType="matrix"
android:src="@drawable/dog" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" > <Button
android:id="@+id/bt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button 1" /> <Button
android:id="@+id/bt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="button 2" /> </LinearLayout > </LinearLayout>
实现仿知乎的开场动画,图片zoomin的效果,实现原理,没加动效的更多相关文章
- [原创]实现android知乎、一览等的开场动画图片放大效果
代码下载地址: https://github.com/Carbs0126/AutoZoomInImageView 知乎等app的开场动画为:一张图片被显示到屏幕的正中央,并充满整个屏幕,过一小段时间后 ...
- iOS动画进阶 - 实现炫酷的上拉刷新动效
移动端訪问不佳,请訪问我的个人博客 近期撸了一个上拉刷新的小轮子.仅仅要遵循一个协议就能自己定义自己动效的上拉刷新和载入,我自己也写了几个动效进去,以下是一个比較好的动效的实现过程 先上效果图和git ...
- 微信小程序开发日记——高仿知乎日报(上)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- 微信小程序开发日记——高仿知乎日报(下)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
- 仿知乎app登录界面(Material Design设计框架拿来就用的TexnInputLayout)
在我脑子里还没有Material Design这种概念,就我个人而言,PC端应用扁平化设计必须成为首选,手当其冲的两款即时通讯旺旺和QQ早就完成UI扁平化的更新,然而客户端扁平化的设计本身就存在天生的 ...
- Android 仿知乎创意广告
代码地址如下:http://www.demodashi.com/demo/14904.html 一.概述 貌似前段时间刷知乎看到的一种非常有特色的广告展现方式,即在列表页,某一个Item显示背后部分广 ...
- 用仿ActionScript的语法来编写html5——第八篇,图片处理+粒子效果
用仿ActionScript的语法来编写html5系列开发到现在,应该可以做出一些东西了,下面先来研究下图片的各种效果预览各种效果看下图效果和代码看这里,看不到效果的请下载支持html5的浏览器 ht ...
- HTML5动画图片播放器 高端大气
我们见过很多图片播放插件(焦点图),很多都基于jQuery.今天介绍的HTML5图片播放器很特别,它不仅在图片间切换有过渡动画效果,而且在切换时图片中的元素也将出现动画效果,比如图中的文字移动.打散. ...
随机推荐
- SQL Server并行死锁案例解析
并行执行作为提升查询响应时间,提高用户体验的一种有效手段被大家所熟知,感兴趣的朋友可以看我以前的博客SQL Server优化技巧之SQL Server中的"MapReduce", ...
- Android 5.x特性概览四
上节,我们说了palatte及其特性,这里我们介绍Android 5.x的另一个特性视图与阴影. 在第一节,我们就提到了Material Design 一大特性就是就是扁平化,倘若说 iOS 的扁平化 ...
- 从CLR角度来看值类型与引用类型
前言 本文中大部分示例代码来自于<CLR via C# Edition3>,并在此之上加以总结和简化,文中只是重点介绍几个比较有共性的问题,对一些细节不会做过深入的讲解. 前几天一直忙着翻 ...
- 每周一道数据结构(四)A*算法&博弈树α-β剪枝
A*算法/博弈树 前阵子考试学了A*算法.博弈树和回溯,自己真是愚蠢至极,根本没就搞明白这些,所以对于这些算法问道的话就不能说清楚,也记不住,所以才有了这篇笔记.在这里感谢面试我的那位工程师~~ A* ...
- [Java Web] 3、WEB开发之HTML基础程序试手
1.初试: <html> <body> <h1>My First Heading</h1> <p>My first paragraph.&l ...
- 微软MSDN订阅用户已可提前手工下载Windows 10安装包
在Windows 10发布之夜,当全世界都在翘首以盼Windows 10免费发布推送的到来,MSDN订阅用户可以立马享受一项令人项目的特殊待遇:手工下载Windows 10完整安装包+免费使用的激活密 ...
- js围绕屏幕转圈的方块
点击运动按钮后,方块会挨着浏览器的边,从左到右,从上到下转一圈. 这个我居然写了几天,我也是不想说什么咯. 完成代码一: <!-- Author: XiaoWen Create a file: ...
- atitit.无线网卡 不能搜索到WiFi 无线路由信号的解决不能上网
atitit.无线网卡 不能搜索到WiFi 无线路由信号的解决不能上网 #---现象 pc机无线网卡不能搜索到无线路由信号.. 但是笔记本和手机是可以的... 不过pc机无线网卡能搜索到别的路由的信号 ...
- paip.获取proxool的配置 xml读取通过jdk xml 初始化c3c0在代码中总结
paip.获取proxool的配置 xml读取通过jdk xml 初始化c3c0在代码中 xml读取通过jdk xml 初始化c3c0在代码中.. ... 作者Attilax 艾龙, EMAI ...
- hdu 1087 动态规划之最长上升子序列
http://acm.hdu.edu.cn/showproblem.php?pid=1087 Online Judge Online Exercise Online Teaching Online C ...