㈠ android 调用系统相机拍照后 添加文字水印
昨天需要添加照片水印的功能,google后找到了博客大v 水寒 的文章 对我帮助很大 http://blog.csdn.net/dawanganban/article/details/51148070
大v的文章 很有深度 非常有用
添加水印有了大v的工具类不成问题 但是在获取拍照后返回的图片时,由于使用的是拍照后的缩略图,导致处理后图片模糊不清;所以想到了先保存原图,再通过原图添加水印(以下方式,获取的是稍大的缩略图,比系统默认的清晰);
经过一番折腾 终于获取了 想要的图片 美中不足的是水印有点模糊 整体效果还好
㈡ android加载gif的时候先加载一张缩略图 点击加载动图怎么实现的
服务端存储了一张GIF图,当请求时会发送这张GIF图的地址。在Android应用中加载GIF的第一帧时,可以使用Glide库来实现。具体操作如下:
Glide.with(context).load(url).asBitmap().into(imageview);
上述代码片段中,Glide是一个流行的Android图片加载库,用于处理图片加载和显示。首先,通过Glide.with(context)初始化Glide,这里的context可以是Activity或Application的实例。然后,调用load方法,传入GIF图的URL地址。接着,使用asBitmap()方法指定加载的图片格式为Bitmap,这样可以确保加载的是GIF的第一帧。最后,调用into方法,将加载的图片显示到指定的ImageView中。
这种方法的好处是简单易用,同时也支持网络图片的缓存和加载优化,能够提高应用的性能和用户体验。需要注意的是,如果需要加载整个GIF动画,可以去掉asBitmap()方法,直接调用load(url).into(imageview)。
在实际应用中,为了提升用户体验,可以在加载GIF动画之前,先展示一张缩略图。这样,在GIF动画加载完成后,可以迅速切换到完整的动画效果。具体实现方式是,在Glide加载GIF的第一帧之前,先加载一张预定义的缩略图。当GIF加载完成后,可以使用View动画或图片切换等技术实现平滑过渡。
此外,Glide还提供了许多其他功能,例如错误处理、加载指示器、缓存控制等。通过这些功能,可以进一步优化图片加载过程,提升应用的整体表现。
㈢ android4.4 中如何获取最近应用的缩略图
最近有项需求是获取应用的缩略,用于在动画时显示。因此就对此块知识简要了解了一下。
在android中获取视频文件的缩略图有三种方法:
1.从媒体库中查询
新视频增加后需要SDCard重新扫描才能给新增加的文件添加缩略图,灵活性差,而且不是很稳定,适合简单应用
2. android 2.2以后使用ThumbnailUtils类获取
实现简单,但2.2以前的版本不支持
3.调用jni文件,实现MediaMetadataRetriever类
实现复杂,但比较灵活,推荐使用
那么Android 中如何获取最近应用的缩略图,这块也有现成的函数,不过都被 @hide 掉了,所以需要利用java reflect 反射才能使用
核心代码如下:
package com.example.testondraw;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import android.app.ActivityManager;
import android.graphics.Bitmap;
import android.util.Log;
/**
* 调用隐藏方法的助手类
*/public class HideExploder {
static final String TAG = "HideExploder";
private final static Object refLock = new Object();
private static Method getTaskThumbnails = null;
private static Field taskThumbnailsBitmap = null;
@SuppressWarnings("rawtypes")
public static void listAllObject(String classFullName) {
try {
Log.i(TAG, "listAllObject classFullName: " + classFullName);
Class<?> clazz = Class.forName(classFullName);
// 反射属性字段
Field[] fields = clazz.getDeclaredFields();
// 反射方法字段
Method[] methods = clazz.getDeclaredMethods();
// 反射构造器
Constructor[] constuctors = clazz.getDeclaredConstructors();
Log.i(TAG, "FIELD========");
for (Field f : fields) {
Log.i(TAG, "TYPE: " + f.getType() + " NAME: " + f.getName());
}
Log.i(TAG, "METHOD========");
for (Method m : methods) {
Log.i(TAG, "METHOD NAME: " + m.getName());
}
Log.i(TAG, "CONSTUCTOR========");
for (Constructor c : constuctors) {
Log.i(TAG, "NAME:" + c.getName());
Class[] clss = c.getParameterTypes();
Object o = null;
// 产生实例
try {
if (clss.length == 0)
o = c.newInstance();
else if (clss.length > 0) {
// TODO
}
Log.i(TAG, "object: " + o);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static Bitmap getTaskThumbnailsBitmap(ActivityManager am, int id) {
synchronized (refLock) {
try {
if (getTaskThumbnails == null) {
getTaskThumbnails = am.getClass().getDeclaredMethod(
"getTaskThumbnails", int.class);
}
if (getTaskThumbnails != null) {
Object thumbnails = getTaskThumbnails.invoke(am,
Integer.valueOf(id));
if (thumbnails != null) {
if (taskThumbnailsBitmap == null)
taskThumbnailsBitmap = thumbnails.getClass()
.getField("mainThumbnail");
if (taskThumbnailsBitmap != null) {
return (Bitmap) taskThumbnailsBitmap
.get(thumbnails);
}
}
}
} catch (Exception e) {
Log.w(TAG, "getTaskThumbnailsBitmap error:" + e);
e.printStackTrace();
}
}
return null;
}
}