2011.09.27(2)——— android ImageView上下同时拉伸的效果
在
http://lipeng88213.iteye.com/blog/1180817里面 我们把一张图的正中间显示在了ImageView里面 现在需要做的就是 我点击图片 显示完整的图像,因为我们的图片是正中间显示在ImageView里面的 所以应该需要一个上下同时拉伸图片的动画
最开始没有动画的代码如下:
package com.lp;
import java.util.Enumeration;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
public class MainActivity extends Activity {
private TextView tv;
private ImageView iv;
private boolean isClick = false;
private int height ;
private int width ;
private Bitmap b2;
@SuppressWarnings("static-access")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView)findViewById(R.id.iv);
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
System.out.println(b.getHeight()+" "+b.getWidth());
b2 = b.createScaledBitmap(b, 600, Math.round(600*(b.getHeight()*1.0f/b.getWidth())), true);
if(b!=null){
b.recycle();
}
System.out.println(b2.getHeight()+" "+b2.getWidth());
iv.setImageBitmap(b2);
iv.setScaleType(ImageView.ScaleType.CENTER);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(!isClick){
LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
height = iv.getHeight();
width = iv.getWidth();
iv.setLayoutParams(params);
iv.setImageBitmap(b2);
}else{
LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
System.out.println(height + " "+width);
params.height = height;
params.width = width;
iv.setLayoutParams(params);
iv.setImageBitmap(b2);
}
}
});
}
}
}
这个没有动画效果 显得特别突兀 所以需要一个动画来过渡一下
1、当然 首先我想到的是Animation 如果android自带的动画效果能满足的话 那就方便了
写了一个imageview.vml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.0"
android:fromYScale="1.0"
android:toYScale="0.3"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="true"
android:duration="1400" />
</set>
调用:
Animation a = AnimationUtils.loadAnimation(MainActivity.this, R.anim.imageviw);
iv.setLayoutParams(params);
动画是出来了 但是和我预想的差距太大了
它只是把现有的图片进行缩放,并不会把原来图片没有显示出来的部分显示出来
而我想要的是 把整个图像都显示完全 并不是针对部分图片进行缩放
2、我想 我们显示imageView显示的是图片的中间部分 那我们可不可以动态的更新ImageView的宽高 并且我们的ImageView的scaleType为CENTER 所以就会显示出来上下同时拉伸的效果
基于这样想法 我开始实践:
2.1、首先 我先试试 这个方法可行不可行
package com.lp;
import java.util.Enumeration;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
public class MainActivity extends Activity {
private TextView tv;
private ImageView iv;
private boolean isClick = false;
private int height ;
private int width ;
private Bitmap b2;
private int i = 50;
@SuppressWarnings("static-access")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView)findViewById(R.id.iv);
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
System.out.println(b.getHeight()+" "+b.getWidth());
b2 = b.createScaledBitmap(b, 600, Math.round(600*(b.getHeight()*1.0f/b.getWidth())), true);
if(b!=null){
b.recycle();
}
System.out.println(b2.getHeight()+" "+b2.getWidth());
iv.setImageBitmap(b2);
iv.setScaleType(ImageView.ScaleType.CENTER);
tv = (TextView)findViewById(R.id.tv);
tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ImageAnimation();
}
});
}
private void ImageAnimation(){
LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
System.out.println(i);
params.width = 600;
params.height = i;
iv.setLayoutParams(params);
iv.setImageBitmap(b2);
iv.setScaleType(ImageView.ScaleType.CENTER);
i = i+10;
}
}
就是通过不断的点击TextView实现ImageView的宽高动态更新 来拉伸图片
这个测试 成功了 下面就是把不但点击点击TextView的操作封装一下:
2.2、线程
我开始用线程来实现:
package com.lp;
import java.util.Enumeration;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
public class MainActivity extends Activity {
private TextView tv;
private ImageView iv;
private boolean isClick = false;
private int height ;
private int width ;
private Bitmap b2;
private int i = 50;
private LayoutParams params2222 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
//handler
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==1){
iv.setLayoutParams(params2222);
iv.setImageBitmap(b2);
iv.setScaleType(ImageView.ScaleType.CENTER);
}
}
};
@SuppressWarnings("static-access")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView)findViewById(R.id.iv);
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
System.out.println(b.getHeight()+" "+b.getWidth());
b2 = b.createScaledBitmap(b, 600, Math.round(600*(b.getHeight()*1.0f/b.getWidth())), true);
if(b!=null){
b.recycle();
}
System.out.println(b2.getHeight()+" "+b2.getWidth());
// Bitmap bitmap = Bitmap.createBitmap(b, 100, 20, 200, 300);
System.out.println(Environment.getExternalStorageDirectory());
iv.setImageBitmap(b2);
iv.setScaleType(ImageView.ScaleType.CENTER);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(!isClick){
height = iv.getHeight();
width = iv.getWidth();
new ImageThread().start();
}else{
//
}
}
});
}
private class ImageThread extends Thread{
@Override
public void run() {
while(i<400){
System.out.println(i);
params2222.width = 600;
params2222.height = i;
handler.sendEmptyMessage(1);
i = i+10;
}
}
}
}
但是 没有成功 根本看不见动画效果 什么原因啊?
我想 会不会是运行太快了 所以 修改一下Thread
private class ImageThread extends Thread{
@Override
public void run() {
while(i<400){
System.out.println(i);
params2222.width = 600;
params2222.height = i;
handler.sendEmptyMessage(1);
i = i+10;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
哈哈 果然可以了 不错啊
但是 效果不理想 有一顿一顿的感觉
2.3、AsyncTask
我想 那就用Android系统建议使用的AsyncTask吧
package com.lp;
import java.util.Enumeration;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
public class MainActivity extends Activity {
private TextView tv;
private ImageView iv;
private boolean isClick = false;
private int height ;
private int width ;
private Bitmap b2;
private int i = 50;
private LayoutParams params2222 = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
};
@SuppressWarnings("static-access")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView)findViewById(R.id.iv);
Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
System.out.println(b.getHeight()+" "+b.getWidth());
b2 = b.createScaledBitmap(b, 600, Math.round(600*(b.getHeight()*1.0f/b.getWidth())), true);
if(b!=null){
b.recycle();
}
System.out.println(b2.getHeight()+" "+b2.getWidth());;
iv.setImageBitmap(b2);
iv.setScaleType(ImageView.ScaleType.CENTER);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(!isClick){
height = iv.getHeight();
width = iv.getWidth();
new ImageAsync().execute();
}else{
new ImageAsync().execute();
}
}
});
}
private class ImageAsync extends AsyncTask<Void, Integer, Void>{
@Override
protected Void doInBackground(Void... params) {
if(!isClick){
while(i<400){
System.out.println(i);
params2222.width = 600;
params2222.height = i;
publishProgress(i);
i = i+10;
}
}else{
while(i>50){
System.out.println(i);
params2222.width = 600;
params2222.height = i;
publishProgress(i);
i = i-10;
}
}
isClick = !isClick;
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
iv.setLayoutParams(params2222);
iv.setImageBitmap(b2);
iv.setScaleType(ImageView.ScaleType.CENTER);
}
}
}
这个效果很好 最后决定就用这个了吧
刚开始:
运行中:
完成:
代码见附件
- 大小: 34.7 KB
- 大小: 49.3 KB
- 大小: 60.5 KB
分享到:
相关推荐
标题“2011.09.30——— android ImageView放大缩小”涉及到的是Android开发中的一个关键组件ImageView的使用技巧,尤其是关于图像缩放的功能。在Android应用开发中,ImageView是展示图片的常用控件,它允许我们加载...
标题中的“2011.10.09——— android ImageView放大缩小(2)”指的是一个关于Android平台中ImageView组件的优化技术,特别是如何处理图片的缩放问题。在Android应用开发中,ImageView是用于显示图像的常见组件,但...
在Android开发中,实现圆角和倒影效果是常见的需求,尤其在设计用户界面时,这类视觉元素可以提升应用的美观度和用户体验。本篇内容将深入探讨如何在Android中创建圆角和倒影效果。 首先,让我们了解如何实现圆角...
2011.09.21的这篇博客文章深入探讨了如何开发Android动态壁纸,提供了宝贵的实践经验和源码示例。 一、动态壁纸基础 动态壁纸在Android系统中是通过`LiveWallpaper`服务实现的,它继承自`WallpaperService`类。...
这个`Android源码——imageView.rar`压缩包可能包含了`ImageView`类的源代码,让我们来深入探讨一下`ImageView`及其相关的知识点。 一、`ImageView`概述 `ImageView`是Android SDK中的一个视图类,它继承自`View`或...
此项目“Android源码——ImageView图片循环跑马灯效果源码_new_08.7z”提供了这样的实现示例。下面我们将深入探讨这个效果的实现原理及其相关知识点。 1. **图片资源**: 压缩包中的1-121111112H50-L.png和1_...
这篇博客"2011.08.26——— android ListView之多个item布局"深入探讨了如何在ListView中实现多个不同类型的Item布局,这对于创建动态、丰富的用户界面至关重要。在Android应用设计中,ListView通常用于显示如联系人...
imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在这里处理点击事件,比如启动动画 } }); ``` 2. **动画实现**:为了达到磁贴效果,我们需要使用...
而"安卓Android源码——ImageView图片循环跑马灯的效果"则是一个关于如何实现ImageView中动态、循环展示图片效果的示例项目。这个项目可能包含了自定义View、动画、线程控制等多方面的知识点。 1. 自定义View:为了...
在这个"Android源码——ImageView图片循环跑马灯效果源码_new_08.zip"中,我们可以学习到如何在Android应用中实现这一功能。 首先,我们来理解一下跑马灯效果的基本原理。跑马灯通常是指一组图片或文字在水平或垂直...
这个压缩包“安卓Android源码——android相册系统(用Matrix实现).rar”显然提供了一个使用Matrix类来实现相册功能的示例代码。Matrix是Android SDK中的一个关键类,用于进行2D图像变换,如旋转、缩放、平移等。接...
这个压缩包文件 "安卓Android源码——ImageView 图片循环跑马灯的效果.zip" 提供了一个关于如何在Android中实现这种效果的示例源码。 一、ImageView概述 ImageView 是 Android SDK 中的一个基础组件,主要负责加载...
这个“安卓Android源码——imageView1.rar”压缩包很可能是包含了关于自定义ImageView或者对其功能扩展的源代码示例。 在Android系统中,ImageView的主要功能是加载和显示图片,它支持多种图像格式,如JPEG、PNG等...
这个"Android ImageView图片循环跑马灯效果源码"就是一个典型的示例,适用于学生进行毕业设计学习,以提升其在Android应用开发中的实践能力。 跑马灯效果通常是通过在一个布局中滚动显示多个图片来实现的,这种效果...
这个压缩包文件"安卓Android源码——android相册系统(用Matrix实现).zip"包含了一个使用Matrix类来实现的相册系统源码。Matrix是Android图形库中的一个关键类,它允许开发者对图像进行平移、旋转、缩放等变换操作。...
在这个"Android源码——gesture-imageview.zip"项目中,我们主要探讨的是如何将手势识别功能集成到ImageView组件中,创建一个自定义的GestureImageView。这个源码示例旨在帮助开发者了解如何实现手势操作,如缩放、...
在安卓(Android)开发中,实现ImageView图片循环跑马灯效果是一种常见的动态视觉设计,它通常用于展示一组连续的图片,比如广告轮播或者动画效果。这个效果可以通过自定义一个ImageView或者继承现有组件来实现。...
ImageView是Android系统中用于显示图像视图的组件,属于Android 2.2 API的一部分。它可以从多种来源加载图像,如资源、本地文件或网络,并提供了丰富的功能和自定义选项,以便适应不同应用场景。 ImageView的继承...