移动开发

控制LED的亮度

int i=6; void setup() { // put your setup code here, to run once: pinMode(i,OUTPUT); } void loop() { // put your main code here, to run repeatedly: analogWrite(i,0); delay(1000); analogWrite(i,50); delay(1000); analogWrite(i,100); delay(1000); analogWrite(i,150); delay(1000); analogWrite(i,200); delay(1000); analogWrite(i,250); delay(1000); } 这里用到了analogWrite,参数一是引脚值,参数二是输出的电压值,最大是255V。这里有一个前提,输出的引脚只能是带波浪线的数字引脚,这样才能改变电压值

android 把图片状态由彩色变成灰色

public static final Bitmap grey(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Bitmap faceIconGreyBitmap = Bitmap .createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(faceIconGreyBitmap); Paint paint = new Paint(); ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0); ColorMatrixColorFilter colorMatrixFilter = new ColorMatrixColorFilter( colorMatrix); paint.setColorFilter(colorMatrixFilter); canvas.drawBitmap(bitmap, 0, 0, paint); return faceIconGreyBitmap; }

android Glide简单使用

今天,简单讲讲Android里Glide的简单使用。 Android框架系列: 一.android EventBus的简单使用 二.android Glide简单使用 对于Glide这个加载图片的框架,很多人都在用,我之前使用的是ImageLoader,最近查资料时,发现Glide才是Google推荐的加载图片框架,功能非常强大,而且还有Google专人维护,要知道,ImageLoader已经没人维护了,除了问题可没人解答。所以有必要整理一下Glide的使用。 Glide是谷歌为我们推荐的一个图片加载库。为什么要选择使用Glide呢? 1、代码有人维护,不至于出现问题,项目组都搞不定的时候问题无法解决。(ImageLoader已没人维护了) 2、代码简洁,可读性很好。(Fresco是一个非常优秀的库,但是配置稍显麻烦,同时代码风格读起来有些生疏) 3、功能强大(400多k的包,包含很多功能,例如:像加载Gif图片就是Picasso做不到的) 下面我们就来介绍下Glide的用法: Glide的基本使用 导入库 compile 'com.github.bumptech.glide:glide:3.7.0' 添加代码混淆(可加可不加) -keep public class * implements com.bumptech.glide.module.GlideModule -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { **[] $VALUES; public *; } # for DexGuard only -keepresourcexmlelements manifest/application/meta-data@value=GlideModule 这个别忘了,不要粗心哦,很容易忘得,最简单的问题,往往需要最简单的搞定啦。 简单使用例子 // For a simple view: @Override public void onCreate(Bundle savedInstanceState) { ... ImageView imageView = (ImageView) findViewById(R.id.my_image_view); Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView); } // For a simple image list: @Override public View getView(int position, View recycled, ViewGroup container) { final ImageView myImageView; if (recycled == null) { myImageView = (ImageView) inflater.

Android摄像头使用问题记录

一. camera.getParameters()时候抛出异常“getParameters failed (empty parameters)” 查看了here 由于本应用多处使用摄像头,在不断切换中,可能存在释放和预览相争问题,在遇到这个异常的时候,捕获后对摄像头做释放操作,即可恢复正常。 二. 预览使用surfaceview ,底部有视频(surface)等,需要设置surfaceview到顶部覆盖底部 //解决和底部视频广告重叠的时候不能显示问题 surfaceHolder.setFormat(PixelFormat.TRANSPARENT); //surfaceView放置在顶层,即始终位于最上层 //surfaceView.setZOrderOnTop(true);//位于最上层 surfaceView.setZOrderMediaOverlay(true);//覆盖底部视频 三. 预览后通过setPreviewCallback获取到的data无法转bitmap 因为data属于YUMImage格式,所以不能直接转bitmap,先处理一下byte,使得可以转bitmap private byte[] zpiByte(byte[] data, int mWidth, int mHeight) { YuvImage image = new YuvImage(data, ImageFormat.NV21, mWidth, mHeight, null);//这个参数不要乱动,乱动会转错误 ByteArrayOutputStream stream = new ByteArrayOutputStream(); image.compressToJpeg(new Rect(0, 0, mWidth, mHeight), 100, stream);//先按原尺寸转成jpeg的流,后面再压缩一次。这个也不要乱动参数 byte[] finalface = stream.toByteArray();//此时的尺寸并不小,但我尝试在上面代码直接转小会错位,考虑到要经过网络,所以后面会再转换一次,但转换速度非常快,基本上不会影响性能 int rotateAngle = mFaceFragment.getRotation(); Log.i(TAG, "rotateAngle" + rotateAngle); if (rotateAngle > 0) {//如果检测的时候需要旋转,那么拍下来的图片也需要旋转 shi Bitmap bitmap; bitmap = BitmapFactory.

HttpUrlConnection

一.GET和POST方式有什么区别 GET方式属于明文传参,在地址栏可以看到参数,调用简单,不安全。 POST方式输入暗文传参,在地址栏不可见,调用复杂,安全。 二.HttpUrlConnection请求网络实例 1.创建URL对象 URL url = new URL("https://www.baidu.com/"); 2.通过URL对象调用openConnection()方法获得HttpURLConnection对象 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 3.HttpURLConnecton对象调用getlnputStream()方法向服务器发送http请求并获取到服务器返回的输入流 InputStream inputStream = connection.getInputStream(); 4.读取输入流,转换成String字符串 InputStreamReader reader = new InputStreamReader(inputStream); //创建BufferedReader对象 BufferedReader bufferedReader = new BufferedReader(reader); //开始读取 String temp = ""; StringBuffer stringBuffer = new StringBuffer(); 注:1.在Android中访问网络必须添加网络权限。 <uses-permission android:name="android.permission.INTERNET" /> 2.在Android中访问网络必须放在子线程中执行 三.HttpUrlConnection请求网络图片实例 xml代码如下: id="@+id/web_btn1" android:layout_width="match_parent" android:layout_height="50dp" android:text="访问网络图片"/> id="@+id/web_iv" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop"/> 效果如图: Java代码如下: web_btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new Thread(new Runnable() { @Override public void run() { getWebpic(); } }).

webView中导入百度地图和设置样式

首先看效果图: ####怎样获取百度地图api 第一种方式:找到“百度地图api” 第二种方式:”百度地图生成器“ 注意此方式生成的地图使用的是百度地图api1.1 ####设置地图样式 博主使用的是用百度地图生成器生成的地图,可以先保存成html格式,查看地图是否需要改进 – 消除百度地图的logo 方法:使用Google浏览器打开刚刚保存的HTML,打开开发者模式(或者按F12) 添加样式消除logo .BMap_cpyCtrl { display: none; } .anchorBL { display: none; } #####设置背景色 因为这个样式在百度地图api1.0中不起效,所以我把JavaScript换成了3.0 原js: 换成api3.0 #####设置地图的大小 这里设置充满屏幕,需要改动三个地方,是否还有其他方法不太清楚,但是博主是这样做的(可能我太菜了) 暂时博主就只设置这几个样式,最终效果图如下: ####使用webView加载百度地图 这里我使用Javafx中的webView组件,详情可见:WebView组件概览 目录结构: package work.javaee.maptest; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.BorderPane; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; public class Main extends Application{ @Override public void start(Stage primaryStage) throws Exception { //设置窗体布局 BorderPane borderPane = new BorderPane(); //创建scene Scene scene = new Scene(borderPane); //创建WebView和WebEngine对象 WebView webView = new WebView(); WebEngine webEngine = webView.

popopWindow 实现顶部筛选菜单(顶部不变,底部阴暗)思路记录

先上效果: 需要解决的问题: 1.popopWindow 位置(此处为toolbar正下方) 2.顶部不变,底部阴暗 3.popopWindow 根据item个数适配高度,并设置最大height 一、popopWindow 位置 首先第一点,传入的parent为toolbar。下面的location位置为toolbar在屏幕中位置的左上角那个点(x,y) int[] location = new int[2]; parent.getLocationOnScreen(location); popupWindow = new PopupWindow(view, popWidth, LayoutParams.WRAP_CONTENT); popupWindow.setFocusable(true); popupWindow.setOutsideTouchable(true); popupWindow.setBackgroundDrawable(new BitmapDrawable()); popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, ScreenUtils.getScreenWidth(parent.getContext())- popupWindow.getWidth()-DensityUtil.dip2px(context,10), location[1] + parent.getHeight()); 二、顶部不变,底部阴暗 第一次尝试 WindowManager.LayoutParams lp = context.getWindow().getAttributes(); lp.alpha = alpha; context.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); context.getWindow().setAttributes(lp); 标题栏也会变暗,尝试失败。 第二次尝试 在toolbar下方放一个view(背景色为暗色)占满剩余屏幕,通过popupwindow展示与否,来控制view的显示与否来实现 尝试成功。 三、popopWindow 根据item个数适配高度,并设置最大height 其他弹出类的窗口类似!在获取width与height之前先进行测量!myView为展示的listview,通过获取其高度,并与最大高度比较来决定最终使用的高度值。 PopupWindow pw= new PopupWindow(myView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); int maxH = DensityUtil.dip2px(getActivity(), 80); myView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); if(myView.getMeasuredHeight()>maxH){ pw.setHeight(maxH); } 

Activity 转场动画踩坑

目标效果 实现方案 Activity#overridePendingTransition() android:windowAnimationStyle 参考文章 目标效果 页面出现的效果是自下向上滑入,消失的效果是自上向下滑出,时长、速度未知。 实现方案 为表述方便,我们假设由 Activity A 打开 Activity B。 Activity#overridePendingTransition() A 页面不变,B 页面出现,在 Activity A 中 startActivity() 后面添加代码: overridePendingTransition(android.R.anim.slide_in_up, R.anim.anim_hold); 注意,如果第二个参数为 0,切换时未出现黑色背景。 slide_in_up.xml <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromYDelta="100%" android:interpolator="@android:anim/accelerate_interpolator" android:startOffset="0" android:toXDelta="0" /> slide_out_down.xml <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="300" android:fromYDelta="0%p" android:interpolator="@android:anim/accelerate_interpolator" android:toYDelta="100%p" /> anim_hold.xml <translate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="200" android:fromYDelta="0" android:toYDelta="0" /> 注意,anim_hold.xml 中的 duration 不能设置过长,否则,页面过度已完成立即返回桌面,Activity A 依然在展示,覆盖在桌面上。 A 页面不变,B 页面消失的动画,是在 Activity B 中 finish() 后面添加代码: overridePendingTransition(0, android.R.anim.slide_out_down); 效果(锤子 t2 和 华为 mate 9 pro): 图1

Android Deep Link

Android Deep Link 官网参考文档 使用场景 用户在网页点击了一个链接以后,直接引导用户在本地应用中查看对应的内容。 原理 当我们点击或者自动化的网络请求会生成一个web URI intent,Android系统按照一定顺序去处理这个请求。 处理顺序为:1.打开所有可以处理本URL应用中用户默认选择的;2.打开唯一能处理这个URL的应用;3.将所有可以处理这个URL的应用展示在Dialog中让用户选择 基本步骤 在manifest文件中定义IntentFilter 建立对应处理的Activity (对于Android App Link而言)将本地内容与URL地址通过服务器上的Digital Asset Links文件关联起来 辅助工具 Android Studio的App Link Assistant使用说明:官方使用指南 分类 Deep Link,Android App Link Deep Link 配置 在Manifest中增加intent filter : ACTION_VIEW : 包含BROWSABLE,DEFAULT.BROWSABLE(必须包含,才可以处理来至l浏览器的Intent Filter) : 指定可以响应的URI信息,至少包含scheme标签,可以使用path,pathPattern或者pathPrefix去处理相似的URI // 可以响应example://gizmos 和 http://www.example.com/gizmos的Activity <activity android:name="com.example.android.GizmosActivity" android:label="@string/title_gizmos" > <intent-filter android:label="@string/filter_view_http_gizmos"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="http" android:host="www.example.com" android:pathPrefix="/gizmos" /> intent-filter> <intent-filter android:label="@string/filter_view_example_gizmos"> <action android:name="

Deep linking 深度链接

使用安卓或ios软件的过程中经常碰到这样一种情况:当我在浏览器打开一个页面时,时常会自动打开相对应的app,并进入相应的app页面中,这就用到一项技术-Deep Linking,下面就来介绍一下如何在自己的android APP中使用这项技术。 1。假设已经有了一个app项目,我们需要在项目中新建一个Activity。我们暂且取名为ViewActivity,在AndroidManifest.xml文件中的ViewActivity标签中添加Intent-filter: <activity android:name=".activity.ViewActivity"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="myapp"/> intent-filter> activity> 2。此时在网页中就可调用这个地址就可以打开我们的app,下面是我写的一个测试deep linking的html代码: </span> <html> <head> <meta charset="{CHARSET}"> <title>title> head> <body> <a href="myapp://">打开我的appa> body> html> 在手机上打开这个网页,点击链接“打开我的app”就可以自动打开我们的app了,并且能自动进入ViewActivity这个页面中。其实并不是只有myapp://这个链接可以进入我们的app,只要开头为myapp://的链接都可以自动进入我们的app。 3.但是我们的要求不是自动进入app的ViewActivity页面,我们的ViewActivity只是作为一个处理deep linking 的一个过渡页面。总不能在每个页面都要写这么一套代码吧,当然不能,下面我就来介绍如何根据schema内容来引导app进入页面 1).在ViewActivity中取出我们的URI值。在此顺带讲解一下URI值中的各个属性,可能有些代码在我们这个测试项目中用不到,只是作为demo讲解一下(我的项目使用kotlin写的,暂时就用kotlin给大家讲解了,我相信懂java的应该都能看懂kotlin) val uri = intent.data//链接地址 val host = uri.host//域名 var query=uri.query//获取参数列表 var params = query.toString().split("&") var bundle=Bundle()//bundle容器,用来保存传递链接问号后带的参数 if(null!=params){ for (key_value in params) { bundle.putString(key_value.split("=")[0],key_value.split("=")[1]) } } intent.putExtras(bundle) var pageName=uri.getHost()//这就是我们链接中传递过来的页面名字,因为很多情况下需要统一android与IOS的页面跳转,所以这个名字并不是我们严格意义上的项目中的页面名,而是我们私下里商量好的那个字符串对应哪个页面 when(pageName){ "page1" ->{ intent.setClass(this,Page1::class.java) startActivity(intent) } "