`

2011.09.27(2)——— android ImageView上下同时拉伸的效果

阅读更多
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放大缩小

    标题“2011.09.30——— android ImageView放大缩小”涉及到的是Android开发中的一个关键组件ImageView的使用技巧,尤其是关于图像缩放的功能。在Android应用开发中,ImageView是展示图片的常用控件,它允许我们加载...

    2011.10.09——— android ImageView放大缩小(2)

    标题中的“2011.10.09——— android ImageView放大缩小(2)”指的是一个关于Android平台中ImageView组件的优化技术,特别是如何处理图片的缩放问题。在Android应用开发中,ImageView是用于显示图像的常见组件,但...

    2011.10.19(2)——— android 圆角与倒影

    在Android开发中,实现圆角和倒影效果是常见的需求,尤其在设计用户界面时,这类视觉元素可以提升应用的美观度和用户体验。本篇内容将深入探讨如何在Android中创建圆角和倒影效果。 首先,让我们了解如何实现圆角...

    2011.09.21——— android 动态壁纸开发

    2011.09.21的这篇博客文章深入探讨了如何开发Android动态壁纸,提供了宝贵的实践经验和源码示例。 一、动态壁纸基础 动态壁纸在Android系统中是通过`LiveWallpaper`服务实现的,它继承自`WallpaperService`类。...

    安卓Android源码——imageView.rar

    这个`Android源码——imageView.rar`压缩包可能包含了`ImageView`类的源代码,让我们来深入探讨一下`ImageView`及其相关的知识点。 一、`ImageView`概述 `ImageView`是Android SDK中的一个视图类,它继承自`View`或...

    Android源码——ImageView图片循环跑马灯效果源码_new_08.7z

    此项目“Android源码——ImageView图片循环跑马灯效果源码_new_08.7z”提供了这样的实现示例。下面我们将深入探讨这个效果的实现原理及其相关知识点。 1. **图片资源**: 压缩包中的1-121111112H50-L.png和1_...

    2011.08.26——— android ListView之多个item布局

    这篇博客"2011.08.26——— android ListView之多个item布局"深入探讨了如何在ListView中实现多个不同类型的Item布局,这对于创建动态、丰富的用户界面至关重要。在Android应用设计中,ListView通常用于显示如联系人...

    android imageview点击图片磁贴效果 很炫

    imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 在这里处理点击事件,比如启动动画 } }); ``` 2. **动画实现**:为了达到磁贴效果,我们需要使用...

    安卓Android源码——ImageView图片循环跑马灯的效果.zip

    而"安卓Android源码——ImageView图片循环跑马灯的效果"则是一个关于如何实现ImageView中动态、循环展示图片效果的示例项目。这个项目可能包含了自定义View、动画、线程控制等多方面的知识点。 1. 自定义View:为了...

    Android源码——ImageView图片循环跑马灯效果源码_new_08.zip

    在这个"Android源码——ImageView图片循环跑马灯效果源码_new_08.zip"中,我们可以学习到如何在Android应用中实现这一功能。 首先,我们来理解一下跑马灯效果的基本原理。跑马灯通常是指一组图片或文字在水平或垂直...

    安卓Android源码——android相册系统(用Matrix实现).rar

    这个压缩包“安卓Android源码——android相册系统(用Matrix实现).rar”显然提供了一个使用Matrix类来实现相册功能的示例代码。Matrix是Android SDK中的一个关键类,用于进行2D图像变换,如旋转、缩放、平移等。接...

    安卓Android源码——ImageView 图片循环跑马灯的效果.zip

    这个压缩包文件 "安卓Android源码——ImageView 图片循环跑马灯的效果.zip" 提供了一个关于如何在Android中实现这种效果的示例源码。 一、ImageView概述 ImageView 是 Android SDK 中的一个基础组件,主要负责加载...

    安卓Android源码——imageView1.rar

    这个“安卓Android源码——imageView1.rar”压缩包很可能是包含了关于自定义ImageView或者对其功能扩展的源代码示例。 在Android系统中,ImageView的主要功能是加载和显示图片,它支持多种图像格式,如JPEG、PNG等...

    Android ImageView图片循环跑马灯效果源码-IT计算机-毕业设计.zip

    这个"Android ImageView图片循环跑马灯效果源码"就是一个典型的示例,适用于学生进行毕业设计学习,以提升其在Android应用开发中的实践能力。 跑马灯效果通常是通过在一个布局中滚动显示多个图片来实现的,这种效果...

    安卓Android源码——android相册系统(用Matrix实现).zip

    这个压缩包文件"安卓Android源码——android相册系统(用Matrix实现).zip"包含了一个使用Matrix类来实现的相册系统源码。Matrix是Android图形库中的一个关键类,它允许开发者对图像进行平移、旋转、缩放等变换操作。...

    安卓Android源码——gesture-imageview.zip

    在这个"Android源码——gesture-imageview.zip"项目中,我们主要探讨的是如何将手势识别功能集成到ImageView组件中,创建一个自定义的GestureImageView。这个源码示例旨在帮助开发者了解如何实现手势操作,如缩放、...

    安卓Android源码——ImageView图片循环跑马灯效果源码.zip

    在安卓(Android)开发中,实现ImageView图片循环跑马灯效果是一种常见的动态视觉设计,它通常用于展示一组连续的图片,比如广告轮播或者动画效果。这个效果可以通过自定义一个ImageView或者继承现有组件来实现。...

    好的-Android2.2 API中文文档——ImageView.doc

    ImageView是Android系统中用于显示图像视图的组件,属于Android 2.2 API的一部分。它可以从多种来源加载图像,如资源、本地文件或网络,并提供了丰富的功能和自定义选项,以便适应不同应用场景。 ImageView的继承...

Global site tag (gtag.js) - Google Analytics