package com.feng.activity;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import com.feng.base.Factory;
import com.feng.manage.IDataTrafficManage;
/**
* 例子来源 http://www.cnblogs.com/phj981805903/p/3281683.html
* @author yufeng
* 2014-7-14
*/
public class TestImageMeshAndroidActivity extends Activity {
private String tag = TestImageMeshAndroidActivity.class.toString();
// 默认加载的图片
private String URL = "http://e.hiphotos.baidu.com/image/pic/item/5243fbf2b2119313f4f4d5ba67380cd791238d00.jpg";
private Bitmap bitmap;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GetImageTask git = new GetImageTask();
git.execute(URL);
}
private class MyView extends View
{
//定义两个常量,这两个常量指定该图片横向、纵向上都被划分为20格。
private final int WIDTH = 20;
private final int HEIGHT = 20;
//记录该图片上包含441个顶点
private final int COUNT = (WIDTH + 1) * (HEIGHT + 1);
//定义一个数组,保存Bitmap上的21 * 21个点的座标
private final float[] verts = new float[COUNT * 2];
//定义一个数组,记录Bitmap上的21 * 21个点经过扭曲后的座标
//对图片进行扭曲的关键就是修改该数组里元素的值。
private final float[] orig = new float[COUNT * 2];
public MyView(Context context)
{
super(context);
setFocusable(true);
//根据指定资源加载图片
//获取图片宽度、高度
float bitmapWidth = bitmap.getWidth();
float bitmapHeight = bitmap.getHeight();
int index = 0;
for (int y = 0; y <= HEIGHT; y++)
{
float fy = bitmapHeight * y / HEIGHT;
for (int x = 0; x <= WIDTH; x++)
{
float fx = bitmapWidth * x / WIDTH;
/*
* 初始化orig、verts数组。
* 初始化后,orig、verts两个数组均匀地保存了21 * 21个点的x,y座标
*/
orig[index * 2 + 0] = verts[index * 2 + 0] = fx;
orig[index * 2 + 1] = verts[index * 2 + 1] = fy;
index += 1;
}
}
//设置背景色
setBackgroundColor(Color.WHITE);
}
@Override
protected void onDraw(Canvas canvas)
{
/* 对bitmap按verts数组进行扭曲
* 从第一个点(由第5个参数0控制)开始扭曲
*/
canvas.drawBitmapMesh(bitmap, WIDTH, HEIGHT, verts
, 0, null, 0, null);
}
//工具方法,用于根据触摸事件的位置计算verts数组里各元素的值
private void warp(float cx, float cy)
{
for (int i = 0; i < COUNT * 2; i += 2)
{
float dx = cx - orig[i + 0];
float dy = cy - orig[i + 1];
float dd = dx * dx + dy * dy;
//计算每个座标点与当前点(cx、cy)之间的距离
float d = (float)Math.sqrt(dd);
//计算扭曲度,距离当前点(cx、cy)越远,扭曲度越小
float pull = 80000 / ((float) (dd * d));
//对verts数组(保存bitmap上21 * 21个点经过扭曲后的座标)重新赋值
if (pull >= 1)
{
verts[i + 0] = cx;
verts[i + 1] = cy;
}
else
{
//控制各顶点向触摸事件发生点偏移
verts[i + 0] = orig[i + 0] + dx * pull;
verts[i + 1] = orig[i + 1] + dy * pull;
}
}
//通知View组件重绘
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
//调用warp方法根据触摸屏事件的座标点来扭曲verts数组
warp(event.getX(), event.getY());
return true;
}
}
class GetImageTask extends AsyncTask<String, Integer, Bitmap> {
private String tag = GetImageTask.class.toString();
/**
* 处理后台执行的任务,在后台线程执 这里的Integer参数对应AsyncTask中的第一个参数
* 这里的String返回值对应AsyncTask的第三个参数
* 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改
* 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作
*/
@Override
protected Bitmap doInBackground(String... params) {
IDataTrafficManage dataTrafficManage = Factory
.getDataTrafficManage();
Bitmap imageBm = dataTrafficManage.getImage(params[0]);
return imageBm;
}
/**
* 信息获取完后的处理
*/
protected void onPostExecute(Bitmap result) {
try {
if (result != null) {
destoryBitmap(bitmap);
bitmap = result;
MyView myview = new MyView(TestImageMeshAndroidActivity.this);
TestImageMeshAndroidActivity.this.setContentView(myview);
} else {
Log.i(tag, "result is null");
}
} catch (Exception e) {
Log.e(tag, e.toString(), e);
}
}
}
// 回收bitmap
public void destoryBitmap(Bitmap bitmap) {
try {
if (bitmap != null && !bitmap.isRecycled()) {
bitmap.recycle();
bitmap = null;
}
System.gc();
} catch (Exception e) {
Log.e(tag, e.toString(), e);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Android drawBitmapMesh扭曲图像 工程代码导入即可使用
共34个文件
class:12个
png:6个
java:6个
4星 · 超过85%的资源 需积分: 10 20 下载量 92 浏览量
2014-07-14
10:54:42
上传
评论 1
收藏 75KB ZIP 举报
温馨提示
实现功能:扭曲 说明:用httpclient 实现在线图片的下载展示,并实现图片处理。 如果,网络图片不存在了,请在代码中修改图片路径。 技术:View,Bitmap,Canvas,AsyncTask,httpclient 来实现其基本功能。部分有注释,例子;来自哪里也还有说明。
资源推荐
资源详情
资源评论
收起资源包目录
TestImageMeshAndroid.zip (34个子文件)
TestImageMeshAndroid
.project 856B
project.properties 361B
proguard.cfg 1KB
src
com
feng
base
Factory.java 323B
Constants.java 338B
activity
TestImageMeshAndroidActivity.java 5KB
manage
DataTrafficManage.java 5KB
IDataTrafficManage.java 206B
AndroidManifest.xml 817B
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
drawable-mdpi
ic_launcher.png 3KB
layout
main.xml 398B
values
strings.xml 206B
assets
gen
com
feng
activity
R.java 646B
.classpath 364B
bin
resources.ap_ 10KB
classes
com
feng
base
Factory.class 581B
Constants.class 483B
activity
R$layout.class 391B
TestImageMeshAndroidActivity$MyView.class 3KB
R$drawable.class 404B
R$attr.class 337B
TestImageMeshAndroidActivity$GetImageTask.class 3KB
TestImageMeshAndroidActivity.class 2KB
R.class 483B
R$string.class 424B
manage
IDataTrafficManage.class 200B
DataTrafficManage.class 6KB
TestImageMeshAndroid.apk 18KB
res
drawable-ldpi
ic_launcher.png 2KB
drawable-hdpi
ic_launcher.png 4KB
drawable-mdpi
ic_launcher.png 2KB
classes.dex 11KB
共 34 条
- 1
资源评论
- u0110961932015-10-12恩 不错 学习 学习
- gongteng172016-01-14从网络获取图片资源,还是值得学习的
-点点滴滴-
- 粉丝: 7
- 资源: 16
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功