我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android仿QQ圆形头像个性名片

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android仿QQ圆形头像个性名片

先看看效果图:


中间的圆形头像和光环波形讲解请看://www.jb51.net/article/96508.htm
周围的气泡布局,因为布局RatioLayout是继承自ViewGroup,所以布局layout就可以根据自己的需求来布局其子view,view.layout(int l,int t,int r,int b);用于布局子view在父ViewGroup中的位置(相对于父容器),所以在RatioLayout中计算所有子view的left,top,right,bottom。那么头像的周围的气泡view是如何计算它的left,top,right,bottom的呢,这些气泡view是坐落在头像外围的圆环上,只要知道这个圆环的半径,然后再根据气泡的个数,计算每个气泡之间的角度,半径加角度就可以计算每个气泡坐落的位置。


 
 private void calculateRatioFrame(List<BubbleView> textViews){ 
 if(textViews.size() == 0) return; 
 mRatioFrameList.clear(); 
 double angle = 0;//记录每个气泡的角度,正上方的为0° 
 double grad = Math.PI * 2 / textViews.size();//梯度,每个TextView之间的角度 (Math.PI 是数学中的90°) 
 double rightAngle = Math.PI / 2;//一圈为360°,一共四个方向,每个方向90°,我们按照小于等于90°来计算,然后再放到相应的方向上 
 //cx,cy是容器的中心点,也是圆形头像的中心点,计算气泡的位置就是已cx,cy为基准来计算的 
 int cx = mWidth / 2;//容器中心x坐标 
 int cy = mHeight / 2;//容器中心y坐标 
 int radius = mMinSize / 2 / 2 / 2 + mMinSize / 2 / 2 ;//动态气泡的组成圆的半径 
 int left = 0; 
 int top = 0; 
 int right = 0; 
 int bottom = 0; 
 int a = 0,b = 0;//a是基于cx的偏移量,b是基于cy的偏移量, 
 //int r = mMinSize / 6 / 2;//气泡半径 
 for (int i = 0; i < textViews.size(); i++) { 
 int r = textViews.get(i).getMeasuredWidth() / 2;//计算得来//固定死的mMinSize / 6 / 2;//气泡半径 
 if(angle >= 0 && angle < rightAngle){ //0 - 90度是计算偏移量 
 //保持角度在 0 - 90 
 a = (int)(radius * Math.sin(Math.abs(angle % rightAngle))); 
 b = (int)(radius * Math.cos(Math.abs(angle % rightAngle))); 
 left = cx + a - r;//cx + a为气泡的中心点,要想得到left,还需减去半径r 
 top = cy - b - r; 
 right = left + 2 * r; 
 bottom = top + 2 * r; 
 }else if(angle >= rightAngle && angle < rightAngle * 2){ // 90 - 180 
 a = (int)(radius * Math.sin(Math.abs(angle % rightAngle))); 
 b = (int)(radius * Math.cos(Math.abs(angle % rightAngle))); 
 left = cx + b - r; 
 top = cy + a - r; 
 right = left + 2 * r; 
 bottom = top + 2 * r; 
 }else if(angle >= rightAngle * 2 && angle < rightAngle * 3){ // 180 - 270 
 a = (int)(radius * Math.sin(Math.abs(angle % rightAngle))); 
 b = (int)(radius * Math.cos(Math.abs(angle % rightAngle))); 
 left = cx - a - r; 
 top = cy + b - r; 
 right = left + 2 * r; 
 bottom = top + 2 * r; 
 }else if(angle >= rightAngle * 3 && angle < rightAngle * 4){ //270 - 360 
 a = (int)(radius * Math.sin(Math.abs(angle % rightAngle))); 
 b = (int)(radius * Math.cos(Math.abs(angle % rightAngle))); 
 left = cx - b - r; 
 top = cy - a - r; 
 right = left + 2 * r; 
 bottom = top + 2 * r; 
 } 
 //将计算好的left, top, right,bottom,angle保存起来 
 mRatioFrameList.add(new RatioFrame(left, top, right,bottom,angle)); 
 //角度再加一个梯度值 
 angle += grad; 
 } 
 } 

计算好气泡的布局left,  top, right,bottom,下面就开始布局这起气泡,布局中的代码就简单的多了


@Override 
 protected void onLayout(boolean changed, int l, int t, int r, int b) { 
 if(mImageView == null) return; 
 int width = mImageView.getMeasuredWidth();//计算圆形头像的宽 
 int height = mImageView.getMeasuredHeight();//计算圆形头像的高 
 //计算圆形头像的left, top, right,bottom 
 int left = mWidth / 2 - width / 2; 
 int top = mHeight / 2 - height / 2; 
 int right = mWidth / 2 + width / 2; 
 int bottom = mHeight / 2 + height / 2; 
 //开始布局 
 mImageView.layout(left,top,right,bottom); 
 //布局爱心动画 
 for (int i = 0; i < mLoveXinList.size(); i++) { 
 ImageView imageView = mLoveXinList.get(i); 
 left = mWidth / 2 + width / 4 - imageView.getMeasuredWidth() / 2; 
 bottom = mHeight / 2 + height / 3; 
 top = bottom - imageView.getMeasuredHeight(); 
 right = left + imageView.getMeasuredWidth(); 
 imageView.layout(left,top,right,bottom); 
 } 
 //布局所有气泡 
 for (int i = 0; i < mTextViews.size(); i++) { 
 TextView textView = mTextViews.get(i); 
 //RatioFrame ratioFrame = mRatioFrameList.get(i);//无动画时使用 
 //有动画的时候,执行期间left, top, right,bottom都在变 
 if(mCurrentRatioFrameList != null){ 
 //ValueAnimator执行动画是所产生的所有气泡left, top, right,bottom 
 RatioFrame ratioFrame = mCurrentRatioFrameList.get(i); 
 textView.layout(ratioFrame.mLeft,ratioFrame.mTop,ratioFrame.mRight,ratioFrame.mBottom); 
 } 
 } 
 } 

好了,静态的气泡排版到这里就好了,下面的问题是,展开时如何使气泡从中心点,以弧形的路径展开,并且气泡的大小也是由小到大变化。这里就用到的动画类ValueAnimator和ScaleAnimation,详解请参考://www.jb51.net/article/96509.htm
向外展开的效果我们可以使用view.layout()不断的重新布局气泡view,让其产生一个平移的效果,下面的一个问题就是如何计算平移轨道上面的left,  top, right,bottom,然后重新请求布局就可以了,那么下面就解决如何计算这个轨迹,分析

弧形轨迹计算,其实就是在直线轨迹的基础上加上偏移量(moveX和moveY),就形成了弧形轨迹,直线轨迹很好计算,关键的就是这个偏移量,因为在首位的偏移量小,而在中间的偏移量大,且在不同的方向上,moveX和moveY的值的正负也不一样。偏移的距离因为是由小到大再由大到小,所以我们用二次函数( -2 * Math.pow(fraction,2) + 2 * fraction)来计算距离,用此二次函数得到的值乘以一个设定的最大值,这个最大值的就会是由小到大再由大到小的变化,然后再用不同的角度来计算它的正负


if(endRatioFrame.mAngle >0 && endRatioFrame.mAngle <= rightAngle){//(0 < angle <= 90)上移,左移 
 moveX = (int)(temp * Math.abs(Math.cos(endRatioFrame.mAngle)));//上移就应该在原本的轨迹上减去moveX 
 moveY = (int)(temp * Math.abs(Math.sin(endRatioFrame.mAngle))); 
 }else if(endRatioFrame.mAngle > rightAngle && endRatioFrame.mAngle <= rightAngle * 2){//(90 < angle <= 180)右移,上移 
 moveX = (int)(-temp * Math.abs(Math.cos(endRatioFrame.mAngle))); 
 moveY = (int)(temp * Math.abs(Math.sin(endRatioFrame.mAngle))); 
 }else if(endRatioFrame.mAngle > rightAngle * 2 && endRatioFrame.mAngle <= rightAngle * 3){//(180 < angle <= 2700)下移,右移 
 moveX = (int)(-temp * Math.abs(Math.cos(endRatioFrame.mAngle))); 
 moveY = (int)(-temp * Math.abs(Math.sin(endRatioFrame.mAngle))); 
 }else if(endRatioFrame.mAngle > rightAngle * 3 && endRatioFrame.mAngle <= rightAngle * 4 || endRatioFrame.mAngle == 0){//(270 < angle <= 360 或者 angle == 0) 左移,下移 
 moveX = (int)(temp * Math.abs(Math.cos(endRatioFrame.mAngle))); 
 moveY = (int)(-temp * Math.abs(Math.sin(endRatioFrame.mAngle))); 
 } 

根据三角函数的变化值,上面的代码可以简化为


moveX = (int)(temp * Math.cos(endRatioFrame.mAngle)); 
moveY = (int)(temp * Math.sin(endRatioFrame.mAngle)); 

通过上面的计算公式逻辑,就可以得到气泡展开时的类型估算器的实现类,退出气泡就将逻辑反一下就可以了


package com.cj.dynamicavatarview.ratio; 
import android.animation.TypeEvaluator; 
import android.content.Context; 
import android.util.TypedValue; 
import java.util.ArrayList; 
import java.util.List; 
 
public class EnterRatioFrameEvaluator implements TypeEvaluator { 
 public static final int OFFSET_DISTANCE = 80; 
 private Context mContext; 
 private int mOffsetDistance; 
 public EnterRatioFrameEvaluator(Context context){ 
 this.mContext = context; 
 mOffsetDistance = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,OFFSET_DISTANCE,mContext.getResources().getDisplayMetrics()); 
 } 
 @Override 
 public Object evaluate(float fraction, Object startValue, Object endValue) { 
 List<RatioFrame> startRatioFrameList = (List<RatioFrame>) startValue;//开始值 
 List<RatioFrame> endRatioFrameList = (List<RatioFrame>) endValue;//结束值 
 List<RatioFrame> ratioFrameList = new ArrayList<>();//产生的新值 
 for (int i = 0; i < endRatioFrameList.size(); i++) { 
 RatioFrame endRatioFrame = endRatioFrameList.get(i); 
 RatioFrame startRatioFrame = startRatioFrameList.get(i); 
 //计算left,top,right,bottom 
 double t = ( -2 * Math.pow(fraction,2) + 2 * fraction);//倾斜变化率 
 int temp = (int)((mOffsetDistance) * t); 
 double rightAngle = Math.PI / 2; 
 int moveX = 0,moveY = 0; 
 //让气泡上、下、左、右平移,形成弧度的平移路线 
 moveX = (int)(temp * Math.cos(endRatioFrame.mAngle)); 
 moveY = (int)(temp * Math.sin(endRatioFrame.mAngle)); 
 //重新得到left ,top,right,bottom 
 int left = (int)(startRatioFrame.mLeft + ((endRatioFrame.mLeft - startRatioFrame.mLeft) * fraction) - moveX); 
 int top = (int)(startRatioFrame.mTop + ((endRatioFrame.mTop - startRatioFrame.mTop) * fraction) - moveY) ; 
 int right = (int)(startRatioFrame.mRight + ((endRatioFrame.mRight - startRatioFrame.mRight) * fraction) - moveX); 
 int bottom = (int)(startRatioFrame.mBottom + ((endRatioFrame.mBottom - startRatioFrame.mBottom) * fraction) - moveY) ; 
 ratioFrameList.add(new RatioFrame(left,top,right,bottom)); 
 } 
 return ratioFrameList; 
 } 
} 

下面就可以用ValueAnimator来实现弧形平移轨迹了


ValueAnimator mAnimatorEnetr = ValueAnimator.ofObject(new EnterRatioFrameEvaluator(getContext()), getRatioFrameCenterList(mRatioFrameCenter,mRatioFrameList),mRatioFrameList); 
 mAnimatorEnetr.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
 @Override 
 public void onAnimationUpdate(ValueAnimator animation) { 
 //获取新的布局值 
 mCurrentRatioFrameList = (List<RatioFrame>) animation.getAnimatedValue(); 
 //请求重新布局 
 requestLayout(); 
 } 
 }); 
 mAnimatorEnetr.setDuration(OPEN_BUBBLE_TIME); 
 mAnimatorEnetr.start(); 

好了,从中心点向外展开的弧形动画到这就实现了,然后再加上缩放的动画就可以了,缩放的动画使用View动画就可以实现。


 
 private void scaleSmallToLarge(List<BubbleView> textViews){ 
 // 以view中心为缩放点,由初始状态缩小到看不间 
 ScaleAnimation animation = new ScaleAnimation( 
 0.0f, 1.0f,//一点点变小知道看不见为止 
 0.0f, 1.0f, 
 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f//中间缩放 
 ); 
 animation.setDuration(OPEN_BUBBLE_TIME);//要和平移的时间一致 
 for (int i = 0; i < textViews.size(); i++) { 
 //再执行动画 
 textViews.get(i).startAnimation(animation); 
 } 
 } 

下面解决的就是展开后,气泡开始浮动,点击气泡后停止浮动,滑动手指的之后气泡跟着手指移动,松开手指后气泡返回到原来的位置,返回时的动画效果和气泡展开的动画效果非常的类似,气泡跟着手指移动也很好实现,只需要将气泡view设置onTouch事件,再onTouch中计算滑动的距离,然后重新view.layout()就可以了,所以这里我们解决浮动问题就可以了。浮动是不规则的,并且浮动的距离和速度也是不一样的,我用View动画实现的效果不是很好,然后就改用了属性动画来实现。只需要将view平移x轴和y轴,让其平移的距离和时间都不同,看上去就像无规则的移动,让其反复的做这样的平移就可以实现浮动的效果。


 
 private AnimatorSet setAnimFloat(View view ){ 
 List<Animator> animators = new ArrayList<>(); 
 //getRandomDp()得到一个随机的值 
 ObjectAnimator translationXAnim = ObjectAnimator.ofFloat(view, "translationX", 0f,getRandomDp(),getRandomDp() , 0); 
 translationXAnim.setDuration(getRandomTime()); 
 translationXAnim.setRepeatCount(ValueAnimator.INFINITE);//无限循环 
 translationXAnim.setRepeatMode(ValueAnimator.INFINITE);// 
 translationXAnim.setInterpolator(new LinearInterpolator()); 
 translationXAnim.start(); 
 animators.add(translationXAnim); 
 // 
 ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(view, "translationY", 0f,getRandomDp(),getRandomDp() , 0); 
 translationYAnim.setDuration(getRandomTime()); 
 translationYAnim.setRepeatCount(ValueAnimator.INFINITE); 
 translationYAnim.setRepeatMode(ValueAnimator.INFINITE); 
 translationXAnim.setInterpolator(new LinearInterpolator()); 
 translationYAnim.start(); 
 animators.add(translationYAnim); 
 AnimatorSet animatorSet = new AnimatorSet(); 
 animatorSet.playTogether(animators); 
 //animatorSet.setStartDelay(delay); 
 animatorSet.start(); 
 return animatorSet; 
 } 

按住停止浮动,松开的时候先归位,然后再次的浮动,如果animator.end()方法,归位后开始浮动的时候会出现闪动的现象,因为属性动画,虽然可以改变view的位置,但是不会改变view的left,top,right,bottom,所以重新开始浮动的时候会出现闪烁的现象,因为x = mLeft + translationX,当重新开始的时候,属性动画是重新创建的,translationX是从0开始的,因此会出现闪烁的现象。


final AnimatorSet animatorSet = mAnimatorSetList.get(position); 
 for (Animator animator : animatorSet.getChildAnimations()) { 
 //执行到动画最后,恢复到初始位置,不然重新开始浮动的时候,会有一个闪烁的bug 
 if(animator.isRunning()) { 
 animator.end();//执行到动画最后 
 animator.cancel();//取消动画 
 } 
 } 

到这里流程已经差不多了,但是当气泡移动到圆形头像的里面的时候松开,气泡应当有一个缩放的效果后归位,然后应有一个接口回调,告诉调用者,我到中间了松开了,你可以做一些相应的处理。现在我们看一下如何计算气泡已经移动到头像里了,其实通过圆形头像中心点和气泡的中心点构成一个直接三角形,然后通过勾股定理,计算直角边的长度和圆形头像的半径做比较,如果小于圆形头像的半径,就说明已经到头像里面了。


 
 private boolean isInPictureCenter(int position,View view,RatioFrame current,RatioFrame endRatioFrame){ 
 RatioPoint centerPoint = new RatioPoint(mWidth/2,mHeight/2); 
 RatioPoint currentPoint = new RatioPoint(current.mLeft + ((current.mRight - current.mLeft) / 2),current.mTop + ((current.mBottom - current.mTop) / 2)); 
 int x = Math.abs(centerPoint.x - currentPoint.x); 
 int y = Math.abs(centerPoint.y - currentPoint.y); 
 //通过勾股定理计算两点之间的距离 
 int edge = (int)Math.sqrt(Math.pow(x,2) + Math.pow(y,2)); 
 int pictureRadius = mImageView.getPictureRadius(); 
 //然后和内部图片的半斤比较,小于pictureRadius,就说明在内部 
 if(pictureRadius > edge){//进入到内部 
 if(mInnerCenterListener != null){ 
 mInnerCenterListener.innerCenter(position,((TextView)view).getText().toString()); 
 } 
 //说明到中心了,执行气泡缩放 
 reveseScaleView(position ,view,current,endRatioFrame); 
 return true; 
 } 
 return false; 
 } 

气泡执行缩放


 
 public void reveseScaleView(final int position , final View view, final RatioFrame current, final Object endRatioFrame) { 
 // 以view中心为缩放点,由初始状态缩小到看不间 
 ScaleAnimation animation = new ScaleAnimation( 
 1.0f, 0.0f,//一点点变小知道看不见为止 
 1.0f, 0.0f, 
 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f//中间缩放 
 ); 
 animation.setDuration(BUBBLE_ENTER_CENTER_SCALE_TIME); 
 animation.setRepeatMode(Animation.REVERSE); 
 animation.setRepeatCount(1); 
 animation.setAnimationListener(new Animation.AnimationListener() { 
 @Override 
 public void onAnimationStart(Animation animation) { 
 } 
 @Override 
 public void onAnimationEnd(Animation animation) { 
 //执行完缩放后,让气泡归位,归位结束后,执行接口回调 
 homingBubbleView(true,position,view, current, endRatioFrame); 
 } 
 @Override 
 public void onAnimationRepeat(Animation animation) { 
 } 
 }); 
 view.startAnimation(animation); 
 } 

气泡进入中心的接口回调定义


public interface InnerCenterListener{ 
 //进入中心,松开归位后调用 
 void innerCenterHominged(int position, String text); 
 //进入中心,松开时调用 
 void innerCenter(int position, String text); 
 } 

下面就剩执行加1操作和播放爱心的动画,这两个动画就是执行两个View动画,这里就不贴出来了,到这里高仿QQ个性名片就讲解结束了,如果讲的不好或有问题欢迎留言
源码下载:GitHub
                 下载2

您可能感兴趣的文章:Android仿微信和QQ多图合并框架(类似群头像)的实现方法Android自定义View模仿QQ讨论组头像效果Android仿微信QQ设置图形头像裁剪功能Android 仿QQ头像自定义截取功能Android自定义控件仿QQ编辑和选取圆形头像Android仿QQ讨论组头像效果


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android仿QQ圆形头像个性名片

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android仿QQ圆形头像个性名片

先看看效果图:中间的圆形头像和光环波形讲解请看://www.jb51.net/article/96508.htm 周围的气泡布局,因为布局RatioLayout是继承自ViewGroup,所以布局layout就可以根据自己的需求来布局其子v
2022-06-06

Android自定义控件仿QQ编辑和选取圆形头像

android大家都有很多需要用户上传头像的需求,有的是选方形,有的是圆角矩形,有的是圆形。 首先我们要做一个处理图片的自定义控件,把传入的图片,经过用户选择区域,处理成一定的形状。有的app是通过在图片上画一个矩形区域表示选中的内容,有的
2022-06-06

Android之头像图片变圆形显示

一:先上效果图二:实现步骤 1.自定义一个转换工具类package com.common.base.util; import android.content.Context; import android.content.res.Typed
2022-06-06

Android仿微信QQ设置图形头像裁剪功能

最近在做毕业设计,想有一个功能和QQ一样可以裁剪头像并设置圆形头像,额,这是设计狮的一种潮流。 而纵观现在主流的APP,只要有用户系统这个功能,这个需求一般都是在(bu)劫(de)难(bu)逃(xue)! 图片裁剪实现方式有两种,一种是利用
2022-06-06

Android应用中如何将头像图片变圆形

本篇文章为大家展示了Android应用中如何将头像图片变圆形,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。实现步骤1.自定义一个转换工具类package com.common.base.util;i
2023-05-31

Android实现本地上传图片并设置为圆形头像

先从本地把图片上传到服务器,然后根据URL把头像处理成圆形头像。 因为上传图片用到bmob的平台,所以要到bmob(http://www.bmob.cn)申请密钥。 效果图:核心代码:代码如下: public class MainActiv
2022-06-06

Android 自定义圆形头像CircleImageView支持加载网络图片的实现代码

在Android开发中我们常常用到圆形的头像,如果每次加载之后再进行圆形裁剪特别麻烦。所以在这里写一个自定义圆形ImageView,直接去加载网络图片,这样的话就特别的方便。 先上效果图主要的方法 1.让自定义 CircleImageVie
2022-06-06

Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)

Feature: 点击选择拍照或者打开相册,选取图片进行裁剪最后设置为圆形头像。Problem: 拍好照片,点击裁剪,弹Toast“无法加载此图片”。Solution: 在裁剪的class里加两行代码intent.addFlags(Inte
2023-05-30

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录