自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 资源 (19)
  • 收藏
  • 关注

原创 Android 点击事件冲突之拦截父控件事件 交给子控件处理

babyDetail.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_DOWN){ //...

2018-12-18 23:20:46 5497 1

原创 仿抖音点赞效果实现 ——————自定义View

玩过抖音的人应该都知道抖音的点赞效果挺酷炫的,而作为码农我们一定想知道它是怎么实现的。先上效果图:实现原理非常的简单,直接上代码:/** * Description: 自定义 仿抖音动画类 * Data:2018/12/7-下午2:21 * Email:[email protected] * Author: feipeng */public class YAL...

2018-12-07 16:43:51 2948 2

原创 Dialog 软键盘 弹 收起问题

一、软键盘收起问题。通常我们会在dialog 监听dialog dismiss  或者监听点击外围操作进行软键盘回收处理,而此时我们持有软键盘的Edittext对象已经被回收所以无法进行响应处理,最终导致我们无法正常收起软键盘。 解决办法,我们可以从Dialog dismiss入手,重写Dialog dismiss   作如下操作:@Overridepublic void dismiss() {...

2018-03-29 17:49:15 2013

原创 Android权限参考大全

访问登记属性android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限获取错略位置android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米获取精确位置android.

2016-08-19 16:26:42 487

原创 Android 如何实现代码混淆

1.刚安装上2.3时,查看sdk目录,发现在\tools下新增了一文件夹“proguard”,如下图,我就在想是不是Google终于官方对proguard考虑进去了。理论上,对java的混淆都是可以的,但关键在于如何编写proguard的混淆脚本。    2.使用SDK2.3后,在需要混淆的工程下新建一个文件“proguard.cfg”,这就是混淆所

2016-08-19 13:46:03 293 1

原创 Android 单ABI架构适配指南:保姆级教学 INSTALL_FAILED_NO_MATCHING_ABIS

1. 32位 64位兼容测试 2.连上数据线后 输入命令能查看手机:多位的 adb shell getprop ro.product.cpu.abi。1.解析apk 查看 当前apk 支持的so 如下: 我这里直接用的android studio自带的 也可以直接改后缀查看。解决方案一: 去除改依赖即可正常单ABI运行。解决方案二: 适配64so。如图: 该手机为64位。

2022-11-27 16:59:59 845

原创 Android 查看当前手机、APP的ABI架构信息

命令:adb shell getprop ro.product.cpu.abi。命令:adb shell "getprop |grep cpu"打开该文件 通过自己应用包名进行过滤 查看当前运行ABI。找到改文件 进行分析。

2022-11-27 16:59:08 3962 1

原创 UVCCamera 手把手教你如何编译 填坑 欢迎私信

UVCCamera 手把手教你如何编译

2022-09-01 17:52:19 726

原创 手把手教你如何让 外部能调用aar内引用aar包的类以及方法

如图:在最外部项目层:build.gradle 添加。如图:在aar项目层:build.gradle 添加。如图:在需要被外部引用的aar 添加。

2022-08-31 15:16:24 1064

原创 如何快速将WPS表格或者excel数据将表格转化为json

简介在开发的过程中,翻译的多语言是写在WPS表格或者EXCEL当中的,那么如何将表格里面的内容转化为json 呢?首先,根据json数据格式的形式,在表格数据前面加上双引号、分号、逗号。其次用利用表格公式的合并内容,将数据、双引号、分号、逗号合并到一起,即可。请看下面的表格数据:...

2022-06-27 15:45:35 5430

原创 Android Studio 全局搜索中文字符

正则:^((?!(\*|//)).)+[\u4e00-\u9fa5]

2022-06-27 11:52:33 1186

原创 超详细的Python安装和环境搭建教程(2022)

第一次接触Python,可能是爬虫或者是信息AI开发的小朋友,都说Python 语言简单,那么多学一些总是有好处的,下面从一个完全不懂的Python 的小白来安装Python 等一系列工作的记录,并且遇到的问题也会写出,让完全不懂的小白也可上手安装,并且完成第一个Hello world代码。安装简介:博主电脑系统:Windwos 10选择安装的Python版本:3.10.4(64位)windows7与windows10安装步骤一致,大家可以放心安装。大家也可以选择Python3.8-3.9.

2022-05-11 10:54:47 5360

原创 AndroidStudio Grade 7.0 Maven搭建

在组件化项目架构中每个组件管理我们一般使用分仓库管理,每个组件分别打包成aar包引入项目依赖。老版本 gradle 我们一般使用 maven 插件来上传aar包,而 Gradle 6.x 版本更新了上传插件为 maven-publish# 低版本使用apply plugin: 'maven'# 6.X 以上版本变化apply plugin: 'maven-publish'复制代码如何生成 aar 包Android Gradle 插件有两种,一个Application,一个是lib.

2022-03-22 19:30:16 3128

原创 BottomSheetDialog中的RecyclerView要点击两次才能触发点击事件的问题/解决BottomSheetDialog中RecyclerView惯性滚动到顶部或底部后滚动状态延迟一秒后

最近在做一个项目,里面用到了BottomSheetDialog嵌套RecyclerView,但是出现了一个令人难以接受的问题,当手指快速滑动RecyclerView,使之依靠惯性滚动到顶部或底部时,当RecyclerView滚动到底部或顶部时立即点击列表条目是无法触发事件的。通过多次测试,发现手指慢慢滑动,也就是RecyclerView没有依靠惯性滚动或没有依靠惯性滚动到顶部或底部时,点击事件...

2020-04-24 16:02:36 1646 1

原创 Mac 配置Gradle环境

我的本机Gradle存放路径:/Users/zhoujian/gradle/gradle-3.3 PS: 拖动文件丢人终端命令拷贝路径,否则会出现路径错误第一步:打开Mac终端Snip20170208_1.png第二步:在终端中输入:open -e .bash_profile,打开.bash_profile文件第三步:编辑.bash_profile文件在.bash_p...

2019-09-02 16:50:27 105

原创 Android P首发版

 几个月前,Android P开发者预览版就已经问世了。但由于它只是为了方便开发者进行适配,很多新版本的重要更新,特别是视觉和交互方面的改进,都没有包含在内。  昨天,在一年一度的Google开发者盛宴I/O 2018大会上,新系统的公众预览版终于正式发布了。  Google CEO的主演讲还没结束,PingWest品玩就已经将手上的这部Pixel 2从Android Oreo升级到P。  相对之...

2018-05-10 11:27:36 817 1

原创 在Mac上完全删除android studio初始配置文件

这几天,我的android studio出了毛病,在android studio 的System setting选项怎样都找不到android sdk设置路径的地方。最后无奈之下(技术不够厉害)强行删除android studio打算重新安装,由于第一次使用mac还不熟,原来直接把android studio拉到垃圾箱是不能完全删除的,还有很多配置文件残留在系统上,导致你想重新配置android...

2018-04-12 17:14:03 823 2

原创 AndroidStudio最详细JNI教程

一:概述在工作中,开发的项目一直没有用到jni知识,很多情况下都是拿别人的so包来用,jni的流程看了一遍又一遍,但是从来没有自己动手实现过,今天我们就自己动手实现一遍,让知识记得更牢固一些。二:NDK下载要实现我们的jni,首先一定要先下载NDK,NDK是什么?我相信很多小伙伴面试的时候一定背这道面试题了吧.如下:NDK是一系列工具的集合NDK提供了一份稳定、功能有限的API头文件声

2017-11-27 17:07:11 297 1

原创 android:descendantFocusability用法简析

android:descendantFocusability用法简析    开发中很常见的一个问题,项目中的listview不仅仅是简单的文字,常常需要自己定义listview,自己的Adapter去继承BaseAdapter,在adapter中按照需求进行编写,问题就出现了,可能会发生点击每一个item的时候没有反应,无法获取的焦点。原因多半是由于在你自己定义的Item中存在诸如Imag

2017-06-19 14:43:42 285

原创 Webview上传文件的那些坑

要说Android中最厉害的组件莫过于Webview 了,夸张点说把这个组件放在屏幕上就可以算作一个简单地浏览器应用了。但你若认为这就万事大吉了,可太小看Webview这个磨人的妖精了,下面单就上传文件的这个坑来做展开。从零开始我们在xml中写入一个简单的Webview组件:RelativeLayout xmlns:android="http://schemas.andro

2017-04-05 10:18:05 315 1

原创 WebView详解

此外,android还为我们提供了一些类来辅助我们的webview的使用。WebViewClient:。WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:  onLoadResource:通知webView加载url指定的资源时触发  onPageStart:页面开始加载时触发  onPageFinish:页面加载完毕时触发  onRe

2017-04-01 11:32:11 370

原创 React Nativie集成到原生App

RN的Guide文档详细地介绍了整个过程,不过其中有些地方没说清楚,可能会给初学者埋下深坑。开发环境准备首先需要搭建开发环境,才能进行后面的步骤。添加JS环境命令行,cd到app到根文件夹下(也可直接在android studio控制台的Terminal下执行),然后按顺序执行下列命令:$npm init$npm install --save react

2017-03-02 15:55:20 532

原创 Android 6.0 运行时权限管理

这是一篇迟来的博客,Android M已经发布一年多了(6.0的变化),在Android M中权限系统被重新设计,发生了颠覆性的变化,很多人把握不好这个变化,一是对这个权限策略和套路还没有摸透,二是没有一个很好的实践来支撑,在我的技术开发群里很多人问我关于权限的问题,往往我都没有直接回答,因为这个问题不是一两句说的清楚的,这几点是今天我写这篇博客的原因。这里有一切关于Android运行时权限你需要

2016-09-12 10:17:28 286

原创 Android Studio 快捷键整理

正式转战Android Studio了,首先把Android Studio的快捷键摘录下来,以备后用。(PS:下面内容转载于 http://www.android-studio.org/index.php/docs/experience/142-androidstudio-shortcut-keys)Alt+回车 导入包,自动修正Ctrl+N   查找类Ctrl+S

2016-08-25 17:48:45 283

原创 清除代码异味

今天,Venkat Subramaniam 就关于清除代码异味的话题给我们做了一个非常有趣的演讲。下面就是我记录的一些他的话。为什么我们需要有质量的代码?敏捷开发方法是用来应付那些要求代码做大量改动的反馈信息的方法。如果程序没有用一种好的表达方式来表现,那程序会很难读,难维护,难修改。什么是代码异味?代码异味是一种由写的很差的代码引起的一种有臭味的感觉,

2016-08-24 15:00:18 279

原创 Android中Dialog系统样式讲解

今天在维护公司的一个APP的时候,有如下场景。弹出一个AlertDialog的时候,在系统语言是中文的时候,如下所示:弹出一个AlertDialog的时候,在系统语言是English的时候,如下所示: 可以发现在系统语言为英语的时候,对话框中的白色文字已经完全看不清楚,对话框的背景颜色也变成了白色。因此需要修改对话框的主题。 修改之前代码如下

2016-08-19 17:16:07 623

转载 http://blog.csdn.net/yaobao888/article/details/52245927

RecyclerView基础介绍android.support.v7.widget.RecyclerView android.support.v7.widget.LinearLayoutManager android.support.v7.widget.GridLayoutManager android.support.v7.widget.StaggeeredGridLayou

2016-08-19 13:39:15 501

转载 http://user.qzone.qq.com/314154775/infocenter#!app=2&via=QZ.HashRefresh&pos=1335594212

树型目录是一种直观的列表显示目录方式,在用户界面得到普遍使用,如Windows的资源管理器窗口,Eclipse的Package Explorer等。因此,我们也想在Android应用中使用这种方式实现对各类信息的分层与显示。然而,Android应用层只提供了ListView单层列表和ExpandableListView二级列表,无法直接显示像树型目录这样多层次的列表。那么如何在android应

2016-08-19 11:49:54 3776

Android原生项目集成最新版本ReactNative

原生项目集成最新版本ReactNative,手把手教你如何一步步集成到原生项目中

2024-01-30

仿微信聊天界面简洁易懂

仿微信聊天界面简洁易懂, 代码量超级小,就三四个类放心下载

2017-10-17

X5内核与原生内核对比

X5内核与原生内核对比

2017-06-29

仿手机通讯录

仿手机通讯录 demo 这个demo 绝对值

2016-04-27

微信、qq、微博...分享

简单实用的,让分享变得不再复杂,几行代码搞定。

2016-03-31

二维码/条形码生成与扫描源码

下载后可直接运行,扫描识别支持二维码/条形码 并且支持生成二维码,内有联系Q 欢迎进行技术交流

2016-03-24

Viewpager动态增加

Viewpager支持点击动态增加页面 可以直接获取页面数 Java编写界面 定义控件大小以及位置详细注解

2016-03-08

支付宝跳转demo

支付宝跳转 demo 可以直接使用 以测试过

2016-01-06

2048游戏项目

仿制 去年火爆游戏2048开发的同款 功能全部实现 大家可以放心下载

2016-01-06

Android多线程

Android多线程断点续传下载器,很好的学习资料,包括完整代码以及详细注释。 无须其他配置,服务器端只需建立一个Dynamic project,然后包含一个mp3文件即可

2015-11-25

Android倒计时

Android 倒计时Demo 很简单实用 下载就可以运行

2015-11-25

Apk反编译神器

反编译神器 本人亲自尝试反编译出了支付宝 支持apk dex dex转txt dex转jar 等许多功能

2015-11-25

Java参考文档

Java参考文档

2015-11-25

Android中文官方文档

Android官方文档 最全最新中文版官方文档

2015-11-25

屏幕取色器

屏幕取色器

2015-11-24

Listview下拉刷新

简单实用 可以直接运行 不用做过多修改

2015-11-24

ViewPager广告轮播+无限循环+定时播放

ViewPager广告轮播+无限循环+定时播放 高仿搜狐轮播图 可直接使用

2015-11-24

QQ分组效果

类似QQ分组 点击可以展开 listview 自定义内容

2015-10-16

Service通知栏提醒

类似于QQ 微信等聊天或者下载App 状态栏提醒 可点击进入

2015-10-16

Android酷炫转动菜单

package com.zhy.view; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.zhy.ccbCricleMenu.R; public class CircleMenuLayout extends ViewGroup { /** * layout的半径 */ private int mRadius; private float mMaxChildDimesionRadio = 1 / 4f; private float mCenterItemDimesionRadio = 1 / 3f; private LayoutInflater mInflater; private double mStartAngle = 0; private String[] mItemTexts = new String[] { "安全中心 ", "特色服务", "投资理财", "转账汇款", "我的账户", "信用卡" }; private int[] mItemImgs = new int[] { R.drawable.home_mbank_1_normal, R.drawable.home_mbank_2_normal, R.drawable.home_mbank_3_normal, R.drawable.home_mbank_4_normal, R.drawable.home_mbank_5_normal, R.drawable.home_mbank_6_normal }; private int mTouchSlop; /** * 加速度检测 */ private float mDownAngle; private float mTmpAngle; private long mDownTime; private boolean isFling; public CircleMenuLayout(Context context, AttributeSet attrs) { super(context, attrs); mInflater = LayoutInflater.from(context); for (int i = 0; i < mItemImgs.length; i++) { final int j = i; View view = mInflater.inflate(R.layout.turnpalte_inner_view, this, false); ImageView iv = (ImageView) view .findViewById(R.id.id_circle_menu_item_image); TextView tv = (TextView) view .findViewById(R.id.id_circle_menu_item_text); iv.setImageResource(mItemImgs[i]); tv.setText(mItemTexts[i]); view.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getContext(), mItemTexts[j], Toast.LENGTH_SHORT).show(); } }); addView(view); } mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight()); // 获得半径 mRadius = Math.max(getWidth(), getHeight()); final int count = getChildCount(); // Log.e("TAG", count + ""); int childSize = (int) (mRadius * mMaxChildDimesionRadio); int childMode = MeasureSpec.EXACTLY; for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child.getVisibility() == GONE) { continue; } int makeMeasureSpec = -1; if (child.getId() == R.id.id_circle_menu_item_center) { makeMeasureSpec = MeasureSpec.makeMeasureSpec( (int) (mRadius * mCenterItemDimesionRadio), childMode); } else { makeMeasureSpec = MeasureSpec.makeMeasureSpec(childSize, childMode); } child.measure(makeMeasureSpec, makeMeasureSpec); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int layoutWidth = r - l; int layoutHeight = b - t; int layoutRadius = Math.max(layoutWidth, layoutHeight); // Laying out the child views final int childCount = getChildCount(); int left, top; int radius = (int) (layoutRadius * mMaxChildDimesionRadio); float angleDelay = 360 / (getChildCount() - 1); for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); if (child.getId() == R.id.id_circle_menu_item_center) continue; if (child.getVisibility() == GONE) { continue; } mStartAngle %= 360; float tmp = layoutRadius * 1f / 3 - 1 / 22f * layoutRadius; left = layoutRadius / 2 + (int) Math.round(tmp * Math.cos(Math.toRadians(mStartAngle)) - 1 / 2f * radius); top = layoutRadius / 2 + (int) Math.round(tmp * Math.sin(Math.toRadians(mStartAngle)) - 1 / 2f * radius); // Log.e("TAG", "left = " + left + " , top = " + top); child.layout(left, top, left + radius, top + radius); mStartAngle += angleDelay; } View cView = findViewById(R.id.id_circle_menu_item_center); cView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getContext(), "you can do something just like ccb ", Toast.LENGTH_SHORT).show(); } }); // Log.e("TAG", // cView.getMeasuredWidth() + " , " + cView.getMeasuredWidth()); int cl = layoutRadius / 2 - cView.getMeasuredWidth() / 2; int cr = cl + cView.getMeasuredWidth(); cView.layout(cl, cl, cr, cr); } private float mLastX; private float mLastY; private FlingRunnable mFlingRunnable; // @Override // public boolean onTouchEvent(MotionEvent event) // { // } @Override public boolean dispatchTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mLastX = x; mLastY = y; mDownAngle = getAngle(x, y); mDownTime = System.currentTimeMillis(); mTmpAngle = 0; if (isFling) { removeCallbacks(mFlingRunnable); isFling = false; return true ; } break; case MotionEvent.ACTION_MOVE: float start = getAngle(mLastX, mLastY); float end = getAngle(x, y); // Log.e("TAG", "start = " + start + " , end =" + end); if (getQuadrant(x, y) == 1 || getQuadrant(x, y) == 4) { mStartAngle += end - start; mTmpAngle += end - start; } else { mStartAngle += start - end; mTmpAngle += start - end; } // rotateButtons((float) (mStartAngle - currentAngle)); requestLayout(); mLastX = x; mLastY = y; break; case MotionEvent.ACTION_UP: float anglePrMillionSecond = mTmpAngle * 1000 / (System.currentTimeMillis() - mDownTime); Log.e("TAG", anglePrMillionSecond + " , mTmpAngel = " + mTmpAngle); if (Math.abs(anglePrMillionSecond) > 230 && !isFling) { post(mFlingRunnable = new FlingRunnable(anglePrMillionSecond)); } if(Math.abs(anglePrMillionSecond) >230 || isFling) { return true ; } break; } return super.dispatchTouchEvent(event); } private float getAngle(float xTouch, float yTouch) { double x = xTouch - (mRadius / 2d); double y = yTouch - (mRadius / 2d); return (float) (Math.asin(y / Math.hypot(x, y)) * 180 / Math.PI); } private int getQuadrant(float x, float y) { int tmpX = (int) (x - mRadius / 2); int tmpY = (int) (y - mRadius / 2); if (tmpX >= 0) { return tmpY >= 0 ? 4 : 1; } else { return tmpY >= 0 ? 3 : 2; } } private class FlingRunnable implements Runnable { private float velocity; public FlingRunnable(float velocity) { this.velocity = velocity; } public void run() { if ((int) Math.abs(velocity) < 20) { isFling = false; return; } isFling = true; // rotateButtons(velocity / 75); mStartAngle += (velocity / 30); velocity /= 1.0666F; postDelayed(this, 30); requestLayout(); Log.e("TAG", velocity + ""); } } }

2015-08-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除