当前位置: 代码网 > it编程>App开发>Android > Android studio之图形与图像处理

Android studio之图形与图像处理

2024年07月28日 Android 我要评论
Overridetry// 获取目录下所有文件(assets下)// 为next按钮绑定事件监听器,该监听器将会查看下一张图片@Override// 找到下一个图片文件while (!&&!&&!// 改变ImageView显示的图片// ②});

bitmap bitmap = drawable.getbitmap();

(3)下面我们用以上知识实现一个图片查看器

我们这个应用十分简单,仅仅包括一个按钮和一个imageview,当我们点击按钮时候,程序会自动去搜索目录中的下一张图片:

关键代码如下:

import android.app.activity;

import android.content.res.assetmanager;

import android.graphics.bitmapfactory;

import android.graphics.drawable.bitmapdrawable;

import android.os.bundle;

import android.view.view;

import android.view.view.onclicklistener;

import android.widget.button;

import android.widget.imageview;

import java.io.ioexception;

import java.io.inputstream;

public class mainactivity extends activity

{

string[] images = null;

assetmanager assets = null;

int currentimg = 0;

imageview image;

@override

public void oncreate(bundle savedinstancestate)

{

super.oncreate(savedinstancestate);

setcontentview(r.layout.main);

image = (imageview) findviewbyid(r.id.image);

try

{

assets = getassets();

// 获取目录下所有文件(assets下)

images = assets.list(“”);

}

catch (ioexception e)

{

e.printstacktrace();

}

final button next = (button) findviewbyid(r.id.next);

// 为next按钮绑定事件监听器,该监听器将会查看下一张图片

next.setonclicklistener(new onclicklistener()

{

@override

public void onclick(view sources)

{

if (currentimg >= images.length)

{

currentimg = 0;

}

// 找到下一个图片文件

while (!images[currentimg].endswith(“.png”)

&& !images[currentimg].endswith(“.jpg”)

&& !images[currentimg].endswith(“.gif”))

{

currentimg++;

if (currentimg >= images.length)

{

currentimg = 0;

}

}

inputstream assetfile = null;

try

{

assetfile = assets.open(images[currentimg++]);

}

catch (ioexception e)

{

e.printstacktrace();

}

bitmapdrawable bitmapdrawable = (bitmapdrawable) image

.getdrawable();

if (bitmapdrawable != null

&& !bitmapdrawable.getbitmap().isrecycled()) // ①

{

bitmapdrawable.getbitmap().recycle();

}

// 改变imageview显示的图片

image.setimagebitmap(bitmapfactory

.decodestream(assetfile)); // ②

}

});

}

}

结果gif

在这里插入图片描述

二、绘图

在为我们的应用界面添砖加瓦的过程中,除了可以使用已有的图片外,android应用还经常需要在运行过程中动态的生成图片,而这样就需要借助于android的绘图支持了。

(1)绘图基础——canvas、paint

android的绘图与swing中的绘图思路类似即开发一个自定义类,然后让该类继承jpanel,之后重写其中的paint(graphics g)方法即可。而我们android中的绘图应继承view组件,并重写其中的ondraw(canvas canvas)即可,光说不练假把式,接下来我们用一段代码绘制几个集合图形。

关键代码如下:

import android.content.context;

import android.graphics.canvas;

import android.graphics.color;

import android.graphics.lineargradient;

import android.graphics.paint;

import android.graphics.path;

import android.graphics.rectf;

import android.graphics.shader;

import android.util.attributeset;

import android.view.view;

public class myview extends view

{

public myview(context context, attributeset set)

{

super(context, set);

}

@override

// 重写该方法,进行绘图

protected void ondraw(canvas canvas)

{

super.ondraw(canvas);

canvas.drawcolor(color.white);

paint paint = new paint();

paint.setantialias(true);

paint.setcolor(color.blue);

paint.setstyle(paint.style.stroke);

paint.setstrokewidth(4);

int viewwidth = this.getwidth();

// 绘制圆形

canvas.drawcircle(viewwidth / 10 + 10, viewwidth / 10 + 10

, viewwidth / 10, paint);

// 绘制正方形

canvas.drawrect(10 , viewwidth / 5 + 20 , viewwidth / 5 + 10

, viewwidth * 2 / 5 + 20 , paint);

// 绘制圆形

canvas.drawcircle(viewwidth * 3 / 10 + 20, viewwidth / 10 + 10

, viewwidth / 10, paint);

// 绘制正方形

canvas.drawrect(viewwidth / 5 + 20 , viewwidth / 5 + 20

, viewwidth * 2 / 5 + 20 , viewwidth * 2 / 5 + 20 , paint);

// 为paint设置渐变器

shader mshader = new lineargradient(0, 0, 40, 60

, new int[] {color.red, color.green, color.blue, color.yellow }

, null , shader.tilemode.repeat);

paint.setshader(mshader);

//设置阴影

paint.setshadowlayer(25 , 20 , 20 , color.gray);

// 绘制圆形

canvas.drawcircle(viewwidth / 2 + 30, viewwidth / 10 + 10

, viewwidth / 10, paint);

// 绘制正方形

canvas.drawrect(viewwidth * 2 / 5 + 30 , viewwidth / 5 + 20

, viewwidth * 3 / 5 + 30 , viewwidth * 2 / 5 + 20 , paint);

canvas.drawtext(getresources().getstring(r.string.circle)

, 60 + viewwidth * 3 / 5, viewwidth / 10 + 10, paint);

canvas.drawtext(getresources().getstring(r.string.square)

, 60 + viewwidth * 3 / 5, viewwidth * 3 / 10 + 20, paint);

}

}

结果截图如下:

在这里插入图片描述

(2)path类

android提供的path是一个非常有用的类,它可以在view上将几个点连成一条路径,然后可以调用canvas中的drawpath(path,paint)方法沿着该路径进行绘图,这些所谓的绘图效果说起来大家很难理解,下面我们通过一段代码来让大家更好的理解一下这些效果,这个应用绘制了7条路径:

关键代码如下:

import android.app.activity;

import android.content.context;

import android.graphics.canvas;

import android.graphics.color;

import android.graphics.composepatheffect;

import android.graphics.cornerpatheffect;

import android.graphics.dashpatheffect;

import android.graphics.discretepatheffect;

import android.graphics.paint;

import android.graphics.path;

import android.graphics.pathdashpatheffect;

import android.graphics.patheffect;

import android.graphics.sumpatheffect;

import android.os.bundle;

import android.view.menu;

import android.view.menuitem;

import android.view.view;

public class mainactivity extends activity

{

@override

protected void oncreate(bundle savedinstancestate)

{

super.oncreate(savedinstancestate);

setcontentview(new myview(this));

}

class myview extends view

{

float phase;

patheffect[] effects = new patheffect[7];

int[] colors;

private paint paint;

path path;

public myview(context context)

{

super(context);

paint = new paint();

paint.setstyle(paint.style.stroke);

paint.setstrokewidth(4);

// 创建并初始化path

path = new path();

path.moveto(0, 0);

for (int i = 1; i <= 40; i++)

{

path.lineto(i * 20, (float) math.random() * 60);

}

// 初始化7个颜色

colors = new int[] { color.black, color.blue, color.cyan,

color.green, color.magenta, color.red, color.yellow };

}

@override

protected void ondraw(canvas canvas)

{

canvas.drawcolor(color.white);

// 不使用路径效果

effects[0] = null;

// 使用cornerpatheffect路径效果

effects[1] = new cornerpatheffect(10);

// 初始化discretepatheffect

effects[2] = new discretepatheffect(3.0f, 5.0f);

// 初始化dashpatheffect

effects[3] = new dashpatheffect(new float[] { 20, 10, 5, 10 },

phase);

// 初始化pathdashpatheffect

path p = new path();

p.addrect(0, 0, 8, 8, path.direction.ccw);

effects[4] = new pathdashpatheffect(p, 12, phase,

pathdashpatheffect.style.rotate);

// 初始化composepatheffect

effects[5] = new composepatheffect(effects[2], effects[4]);

effects[6] = new sumpatheffect(effects[4], effects[3]);

// 将画布移动到(8、8)处开始绘制

canvas.translate(8, 8);

// 依次使用7种不同路径效果、7种不同的颜色来绘制路径

for (int i = 0; i < effects.length; i++)

{

paint.setpatheffect(effects[i]);

paint.setcolor(colors[i]);

canvas.drawpath(path, paint);

canvas.translate(0, 60);

}

// 改变phase值,形成动画效果

phase += 1;

invalidate();

}

}

}

结果gif

在这里插入图片描述

三、实例训练

让我们根据今天所学做两个小小的实例练习吧。

(1)手绘画板

我们主要要实现一个画板,当我们在触摸屏上移动时,就可以在屏幕上绘制任意的图案。

表面上看起来我们可以在画板上自由地画画包括直、曲线,实际上我们还是利用canvas的drawline()方法画直线线。当我们在画板上移动时,两次拖动时间发生点的距离很小,我们用多条极短的直线将他们连起来就好像我们画的是曲线。主要我们还是借助android提供的path类。

关键代码如下:

view代码:

import android.content.context;

import android.graphics.bitmap;

import android.graphics.canvas;

import android.graphics.color;

import android.graphics.paint;

import android.graphics.path;

import android.util.attributeset;

import android.view.motionevent;

import android.view.view;

public class drawview extends view

{

// 定义记录前一个拖动事件发生点的坐标

float prex;

float prey;

private path path;

public paint paint = null;

// 定义一个内存中的图片,该图片将作为缓冲区

bitmap cachebitmap = null;

// 定义cachebitmap上的canvas对象

canvas cachecanvas = null;

public drawview(context context, int width , int height)

{

super(context);

// 创建一个与该view相同大小的缓存区

cachebitmap = bitmap.createbitmap(width, height,

bitmap.config.argb_8888);

cachecanvas = new canvas();

path = new path();

// 设置cachecanvas将会绘制到内存中的cachebitmap上

cachecanvas.setbitmap(cachebitmap);

// 设置画笔的颜色

paint = new paint(paint.dither_flag);

paint.setcolor(color.red);

// 设置画笔风格

paint.setstyle(paint.style.stroke);

paint.setstrokewidth(1);

// 反锯齿

paint.setantialias(true);

paint.setdither(true);

}

@override

public boolean ontouchevent(motionevent event)

{

// 获取拖动事件的发生位置

float x = event.getx();

float y = event.gety();

switch (event.getaction())

{

case motionevent.action_down:

// 从前一个点绘制到当前点之后,把当前点定义成下次绘制的前一个点

path.moveto(x, y);

prex = x;

prey = y;

break;

case motionevent.action_move:

// 从前一个点绘制到当前点之后,把当前点定义成下次绘制的前一个点

path.quadto(prex, prey, x, y);

prex = x;

prey = y;

break;

case motionevent.action_up:

cachecanvas.drawpath(path, paint); // ①

path.reset();

break;

}

invalidate();

// 返回true表明处理方法已经处理该事件

return true;

}

@override

public void ondraw(canvas canvas)

{

paint bmppaint = new paint();

// 将cachebitmap绘制到该view组件上

canvas.drawbitmap(cachebitmap, 0, 0, bmppaint); // ②

// 沿着path绘制

canvas.drawpath(path, paint);

}

}

颜色、大小代码:

<?xml version="1.0" encoding="utf-8"?>

<item android:id=“@+id/red”

android:title=“@string/color_red”/>

<item android:id=“@+id/green”

android:title=“@string/color_green”/>

<item android:id=“@+id/blue”

android:title=“@string/color_blue”/>

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。**

深知大多数初中级android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:android)

更多android高级工程师进阶学习资料

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司android面试真题(含bat、小米、华为、美团、滴滴)和我自己整理android复习笔记(包含android基础知识点、android扩展知识点、android源码解析、设计模式汇总、gradle知识点、常见算法题汇总。)

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

n1j-1713010069131)]

[外链图片转存中…(img-ugjp0zam-1713010069131)]

[外链图片转存中…(img-xbubxxyq-1713010069131)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:android)

更多android高级工程师进阶学习资料

进阶学习视频
[外链图片转存中…(img-yvhl6iqi-1713010069131)]

附上:我们之前因为秋招收集的二十套一二线互联网公司android面试真题(含bat、小米、华为、美团、滴滴)和我自己整理android复习笔记(包含android基础知识点、android扩展知识点、android源码解析、设计模式汇总、gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-tnu3fzos-1713010069132)]

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com