`
zkl_1987
  • 浏览: 245510 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android 笔记 --- Android中几种图像特效处理的集锦

阅读更多
Android中几种图像特效处理的小技巧,比如圆角,倒影,还有就是图片缩放,Drawable转化为Bitmap,Bitmap转化为Drawable等等.

废话少说了,直接讲解今天的实例,本例主要是先获取壁纸(getWallpaper()),然后对当前壁纸的一些特效处理.大家按步骤一步一步来:

第一步:新建一个Android工程命名为ImageDemo,工程结构如下:



第二步:新建一个.java文件,命名为ImageUtil.java,在里面定义一些图片处理方法,代码如下:

package com.android.tutor;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Bitmap.Config;
import android.graphics.PorterDuff.Mode;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.Drawable;
public class ImageUtil {
 
	//放大缩小图片
	public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){
		int width = bitmap.getWidth();
		int height = bitmap.getHeight();
		Matrix matrix = new Matrix();
		float scaleWidht = ((float)w / width);
    	float scaleHeight = ((float)h / height);
    	matrix.postScale(scaleWidht, scaleHeight);
    	Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
		return newbmp;
	}
	//将Drawable转化为Bitmap
	 public static Bitmap drawableToBitmap(Drawable drawable){
	    	int width = drawable.getIntrinsicWidth();
	    	int height = drawable.getIntrinsicHeight();
	    	Bitmap bitmap = Bitmap.createBitmap(width, height,
	    			drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
	                        : Bitmap.Config.RGB_565);
	    	Canvas canvas = new Canvas(bitmap);
	    	drawable.setBounds(0,0,width,height);
	    	drawable.draw(canvas);
	    	return bitmap;
 
	    }
 
	 //获得圆角图片的方法
	public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){
 
		Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap
				.getHeight(), Config.ARGB_8888);
		Canvas canvas = new Canvas(output);
 
		final int color = 0xff424242;
		final Paint paint = new Paint();
		final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
		final RectF rectF = new RectF(rect);
 
		paint.setAntiAlias(true);
		canvas.drawARGB(0, 0, 0, 0);
		paint.setColor(color);
		canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
 
		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
		canvas.drawBitmap(bitmap, rect, rect, paint);
 
		return output;
	}
	//获得带倒影的图片方法
	public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){
		final int reflectionGap = 4;
		int width = bitmap.getWidth();
		int height = bitmap.getHeight();
 
		Matrix matrix = new Matrix();
		matrix.preScale(1, -1);
 
		Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 
				0, height/2, width, height/2, matrix, false);
 
		Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);
 
		Canvas canvas = new Canvas(bitmapWithReflection);
		canvas.drawBitmap(bitmap, 0, 0, null);
		Paint deafalutPaint = new Paint();
		canvas.drawRect(0, height,width,height + reflectionGap,
				deafalutPaint);
 
		canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
 
		Paint paint = new Paint();
		LinearGradient shader = new LinearGradient(0,
				bitmap.getHeight(), 0, bitmapWithReflection.getHeight()
				+ reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP);
		paint.setShader(shader);
		// Set the Transfer mode to be porter duff and destination in
		paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
		// Draw a rectangle using the paint with our linear gradient
		canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
				+ reflectionGap, paint);
 
		return bitmapWithReflection;
	}
 
}



第三步:修改main.xml布局文件,主要放了两个ImageView控件,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<ImageView 
		android:id="@+id/image01" 
	    android:layout_width="wrap_content" 
	    android:layout_height="wrap_content" 
	    android:padding="10px"
	    />
	<ImageView
		android:id="@+id/image02"
		android:layout_width="wrap_content" 
	    android:layout_height="wrap_content" 
	    android:padding="10px"
	/>
</LinearLayout>


第四步:修改主核心程序,ImageDemo.java,代码如下:

package com.android.tutor;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;
public class Imagedemo extends Activity {
	private ImageView mImageView01,mImageView02;
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setupViews();
    }
 
    private void setupViews(){
    	mImageView01 = (ImageView)findViewById(R.id.image01);
    	mImageView02 = (ImageView)findViewById(R.id.image02);
 
    	//获取壁纸返回值是Drawable
    	Drawable drawable = getWallpaper();
    	//将Drawable转化为Bitmap
    	Bitmap bitmap = ImageUtil.drawableToBitmap(drawable);
    	//缩放图片
    	Bitmap zoomBitmap = ImageUtil.zoomBitmap(bitmap, 100, 100);
    	//获取圆角图片
    	Bitmap roundBitmap = ImageUtil.getRoundedCornerBitmap(zoomBitmap, 10.0f);
    	//获取倒影图片
    	Bitmap reflectBitmap = ImageUtil.createReflectionImageWithOrigin(zoomBitmap);
    	//这里可以让Bitmap再转化为Drawable
//    	Drawable roundDrawable = new BitmapDrawable(roundBitmap);    	
//    	Drawable reflectDrawable = new BitmapDrawable(reflectBitmap);   	
//    	mImageView01.setBackgroundDrawable(roundDrawable);
//    	mImageView02.setBackgroundDrawable(reflectDrawable);
 
    	mImageView01.setImageBitmap(roundBitmap);
    	mImageView02.setImageBitmap(reflectBitmap);
    }
 
 
}


第五步:运行上述工程,查看效果如下:



OK大功告成了!!

分享到:
评论

相关推荐

    新版Android开发教程&笔记--基础入门

    新版Android开发教程&笔记--基础入门一 新版Android开发教程&笔记--基础入门二 新版Android开发教程&笔记三--环境搭建与解析 新版Android开发教程&笔记四--Dalvik ADB 新版Android开发教程+笔记五--模拟器、应用1、2...

    android笔记--Service与AIDL

    1. AIDL是Android中用于跨进程通信的关键技术,它允许不同进程间的组件互相调用方法,就像是在同一个进程中一样。 2. AIDL文件定义了一个接口,包含了一系列方法和参数类型。Android编译器会根据AIDL生成相应的Java...

    新版Android开发教程及笔记-完整版.pdf

    新版Android开发教程&笔记--基础入门一.pdf 新版Android开发教程&笔记--基础入门二.pdf 新版Android开发教程&笔记三--环境搭建与解析.pdf 新版Android开发教程&笔记四--Dalvik ADB.pdf 新版Android开发教程+笔记五--...

    Android--极简笔记App

    在笔记App中,RxAndroid可以帮助开发者更方便地处理异步操作,例如保存或同步笔记,同时确保代码的可读性和可维护性。它允许将复杂的事件序列转换为简单的数据流,简化了多线程编程和事件处理。 3. **MVP架构模式**...

    Android代码-Android_Learning_Notes

    4、Android04--Android服务 5、Android05--Android服务通信 6、Android06--Android广播接收器 7、Android07--Android日志系统 8、Android08--Android权限系统 用户界面 9、Android09--Fragment初探 10、Android09--...

    android笔记-10.09

    LinearLayout是Android中最常见的布局之一,它允许子视图按照垂直或水平方向进行排列。在例子中,`orientation="vertical"`表示子视图将自上而下排列。`android:layout_width="fill_parent"`和`android:layout_...

    Android学习笔记--Binder

    【Android学习笔记--Binder】 Binder是Android系统中的核心组件,它是Android系统实现进程间通信(IPC,Inter-Process Communication)的主要方式。Binder机制允许不同进程的组件之间进行数据交换和功能调用,就像...

    android笔记--适应于初学者

    首先,让我们来探讨Android中的Dialog。Dialog是一种在主界面之上弹出的窗口,用于显示临时信息或者进行用户交互。常见的Dialog类型有AlertDialog、ProgressDialog和DatePickerDialog等。在创建Dialog时,你需要先...

    新版Android开发教程及笔记-完整版

    新版Android开发教程及笔记-完整版 比较不错的入门教程

    Android代码-AndroidNote Android笔记

    Android学习笔记 &gt; 十年生死两茫茫,不思量,自难忘,华年短暂,陈辞岁月悠悠伤, &gt; 满腔热血已芜荒,展未来,后生强,战战兢兢,如履薄冰心彷徨, &gt; 青丝化雪、鬓角成霜,已是英雄迟暮,人生怎慷慨激昂? 目录 ...

    android-x86_64-7.1-r2.isoandandroid-x86_64-8.1-rc2.iso

    - 对于教育领域,这也是一种成本效益高的解决方案,可以让学生在熟悉的桌面环境中学习和使用Android应用程序。 ### ISO镜像文件 - **定义**:ISO镜像是光盘内容的数字副本,通常用于保存文件系统结构和所有原始...

    android学习笔记-clip.pdf

    android学习笔记-clip.pdf

    Android学习笔记--Gson笔记

    这篇“Android学习笔记--Gson笔记”将深入探讨如何利用Gson来处理JSON数据,提升Android应用的数据解析效率。 一、Gson简介 Gson库能够将Java对象转换成对应的JSON字符串,反之亦然,这使得在Android应用中存储、...

    新版android开发教程 笔记

    新版Android开发教程&笔记--基础入门一 新版Android开发教程&笔记--基础入门二 新版Android开发教程&笔记三--环境搭建与解析 新版Android开发教程&笔记四--Dalvik ADB 新版Android开发教程+笔记五--模拟器、应用1、2...

    Android群英传笔记-----by ---------刘某人程序员

    《Android群英传笔记》是一本深度探讨Android开发技术的宝贵资料,由知名开发者刘某人倾力编写。这本书详尽地涵盖了Android应用开发的各个方面,旨在帮助读者从基础到高级全面掌握Android编程技能。笔记内容丰富,...

    Android学习笔记-SQLite介绍-以及使用Sqlite-进行数据库的创建-完成数据.pdf

    Android学习笔记-SQLite介绍-以及使用Sqlite-进行数据库的创建-完成数据.pdf

    冰河的渗透实战笔记-冰河.pdf

    冰河整理的全网首个开源的以实战案例为背景的渗透实战笔记,全书共442页,共计37万字(不计空格)。整本书的内容涵盖:Kali基础、渗透工具、木马制作、钓鱼链接生成、爆破密码、内存溢出攻击、web渗透、数据提权、...

    Android Studio 学习笔记-新手入门-(1)第一个案例

    这篇学习笔记将引导新手入门,通过创建第一个简单的案例来了解Android Studio的基本操作。 首先,让我们了解一下Android Studio的核心功能。它基于IntelliJ IDEA,具备代码自动补全、重构、调试等强大的开发特性。...

Global site tag (gtag.js) - Google Analytics