Andrioid 通过话筒实现吹气功能,android最新面试题及答案

mPaint.setStrokeWidth(100);//设置空心线宽

mPath = new Path();//创建新路径

}

//画布绘制

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawColor(Color.TRANSPARENT);

if (!mComplete) //如果还未擦除完成

{

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); //设定目标图模式

canvas.drawBitmap(mBitmap, 0, 0, null);//画图

mCanvas.drawPath(mPath, mPaint); //画布 路径

canvas.drawBitmap(mBitmap, 0, 0, null); //画布图片

}

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int width = MeasureSpec.getSize(widthMeasureSpec);//宽度

int height = MeasureSpec.getSize(heightMeasureSpec);//高度

mBitmap = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);//图片

bitmap = Bitmap.createScaledBitmap(bitmap,width,height,true);//基于原bitmap,创建一个新的宽、高的bitmap

mCanvas = new Canvas(mBitmap); //画布实例化

mCanvas.drawColor(Color.TRANSPARENT);//设置颜色

mCanvas.drawBitmap(bitmap,0,0,null);//画布重绘bitmap

}

}

接下来是mainactivity开始通过有aduiorecordmanger发送过来的message做处理,如果音量分贝大于50,则产生动画效果形成雾

private void getSoundValues(double values){

//话筒分贝大于50,屏幕起雾

if (values >50){

hideView();//隐藏无关控件

drawView.setVisibility(View.VISIBLE); //显示控件

Animation animation = AnimationUtils.loadAnimation(this, R.anim.in_window);//设置透明度

drawView.setAnimation(animation);

audioRecordManger.isGetVoiceRun = false;//设置话筒停止运行

Log.e(“玻璃显示”,“执行”);

}

}

private Handler handler = new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(Message msg) {

switch (msg.what) {

case RECORD://监测话筒

double soundValues = (double) msg.obj;

getSoundValues(soundValues);//获得话筒声音后,屏幕重绘起雾

break;

default:

break;

}

return false;

}

});

这里的anim中的in_window是在res下建立的动画xml文件,用Alpha的值来表示灰的程度,0是完全没有,1是全灰

<alpha

android:fromAlpha=“0”

android:toAlpha=“1”

android:duration=“3000”/>

这个时候当向手机话筒吹气的时候,就会产生雾气。

这时候加入手势擦除功能。

在drawView中加入写一个内部接口让mainactivity来实现

public interface OnCaYiCaCompleteListener{

void complete();

}

private OnCaYiCaCompleteListener mListener;

public void setOnCaYiCaCompleteListener(OnCaYiCaCompleteListener mListener){

this.mListener = mListener;

}

//变量重置

public void setEndValues(){

moveX = 0;

moveY = 0;

mPath.reset(); //路径重置

mComplete =false; //恢复未擦除状态

}

private Runnable mRunnable = new Runnable() {

@Override

public void run() {

int w = getWidth();

int h = getHeight();

float wipeArea = 0;

float totalArea = w * h;

Bitmap bitmap = mBitmap;

int[] mPixels = new int[w * h];

// 获得Bitmap上所有的像素信息

bitmap.getPixels(mPixels, 0, w, 0, 0, w, h);

for (int i = 0; i < w; i++)

{

for (int j = 0; j < h; j++)

{

int index = i + j * w;

if (mPixels[index] == 0)

{

wipeArea++;

}

}

}

if (wipeArea > 0 && totalArea > 0)

{

int percent = (int) (wipeArea * 100 / totalArea);

Log.e(“TAG”, percent + “”);

if (percent > 50)

{

// 清除掉图层区域

mComplete = true;

postInvalidate();

}

}

}

};

@Override

public boolean onTouchEvent(MotionEvent event) {

float x = event.getX();

float y = event.getY();

switch (event.getAction()){

case MotionEvent.ACTION_DOWN:

moveX = x;

moveY = y;

mPath.moveTo(moveX,moveY);

break;

case MotionEvent.ACTION_MOVE:

int dx = (int)Math.abs(moveX - x);

int dy = (int)Math.abs(moveY - y);

if(dx > 1 || dy > 1){

mPath.quadTo(x,y,(moveX + x) / 2,(moveY + y) / 2);

}

moveX = x;

moveY = y;

break;

case MotionEvent.ACTION_UP:

if(!mComplete){ //如果擦除未完成,则新线程开始

new Thread(mRunnable).start();

}

break;

default:

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

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

最后

,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-q8VsCKbe-1710320060139)]
[外链图片转存中…(img-P32dF4Pa-1710320060140)]
[外链图片转存中…(img-vyG37vHN-1710320060140)]
[外链图片转存中…(img-s8WlTjSS-1710320060140)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-OTeIIDP7-1710320060141)]

最后

想要了解更多关于大厂面试的同学可以**点击这里免费获取《面试文档》**除此之外,我也分享一些免费的优质资源,包括:Android学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。快来获取学习资料吧~

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值