精华内容
下载资源
问答
  • Android Studio的安装,史上最详细(超多图)!!

    万次阅读 多人点赞 2019-06-11 14:10:36
    android studio的安装,史上最详细!!欢迎前来观看,感觉有用就点波关注吧!custom 欢迎前来观看,感觉有用就点波关注吧! 1、首先下载Android studio安装包,可以从 http://www.android-studio.org/ 下载最新...

    android studio安装教程,史上最详细(超多图)!!
    安装android studio,史上最详细(超多图)!!

    欢迎前来观看,感觉有用就点波关注吧!

    android studio的安装(补充篇gradle失败的问题)

    传送门:
    补充篇gradle失败的问题

    1、首先下载Android studio安装包,可以从 http://www.android-studio.org/ 下载3.5.2版本,这里采用3.5.2版本进行演示,安装包大小718 MB.
    2.
    在这里插入图片描述

    3.下载后进行安装
    将按照下列步骤进行:
    在这里插入图片描述
    在这里插入图片描述
    下面一步是安装路径的选择,个人建议内存大的就不要乱换了,小编这里就放在了
    D:\android\android studio
    D:\android\android studio
    D:\android\android studio
    文件夹自己新建就好

    在这里插入图片描述

    在这里插入图片描述
    到此基础部分已经完成。

    4.下面一定要逐步完成,一步一步仔细操作:

    点选第二个
    在这里插入图片描述
    然后会有各种提示,下一步到这里

    安装选这个
    custom
    后续可以更改安装位置,否则,只能装在C盘
    在这里插入图片描述

    选择主题风格:(小编喜欢黑色siiiiiii…,你们自行选择)
    在这里插入图片描述
    下方安装路径如果需要更改的话
    一定要改为没有标点符号,(空格之类千万不要有,另外,中文不能出现!!!!!本文所有路径,不能出现中文!!!!新手按照我的去安装就好,就不需要费心改变了)
    勾选内容参考图中
    在这里插入图片描述
    内存的选择,我个人是16G的内存条啦,我就选了4096MB你们根据情况选择就好,最好不要低于2G(2048MB)
    在这里插入图片描述
    到此下一步,开始疯狂跑安装:
    在这里插入图片描述
    当然是选择完成啦!
    终于见到了曙光!!
    下图!
    在这里插入图片描述

    5.开始演示第一个hello world程序!
    点击上图的start a new balabala…
    演示为空白案例,不做其他模板展示!
    在这里插入图片描述
    项目名称,域名,语言,API等级,根据需要选择就好
    在这里插入图片描述
    继续!
    第一次安装会进行环境配置,会进行gradle
    (这里可能很多同胞会失败,原因是在远程下载的gradle被墙了,可以参考我的另一篇博客android studio的安装(补充篇gradle失败的问题)
    耐心等待就好

    分析完成之后。点击右上角的锤子,然后点击三角形
    在这里插入图片描述
    由于第一次安装,需要配置一个新的模拟器
    (不懂模拟器没事,按照步骤来就好哈哈哈)

    创建一个新虚拟设备(启动按钮右侧,AVDmanager)
    在这里插入图片描述
    选择想要的模板类型,强烈建议图中的两个,其他的,,,好丑哈哈
    在这里插入图片描述
    继续选择图片素材
    需要下载1个G左右!
    下面按照图片进行操作即可!
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    完成!
    下面一步改名无关紧要直接完成即可!
    此时前面那个选择虚拟设备画面已经有了一个设备,进行勾选!

    在这里插入图片描述
    看见这个画面
    恭喜你,安卓旅程出发!
    在这里插入图片描述
    默认即为helloworld !第一个程序完成!
    不用任何操作!
    在这里插入图片描述

    展开全文
  • Android反编译工具包(升级)官方绿色版

    万次下载 热门讨论 2012-10-10 19:18:30
    Android反编译工具包,内含图形和命令两种反编译方式,命令支持windows和linux平台,亲测验证成功!详见博客:Android APK反编译详解(附图) http://blog.csdn.net/sunboy_2050/article/details/6727581
  • 7个代表性的Android应用程序完整源代码

    万次下载 热门讨论 2011-06-14 15:04:30
    7个比较具有代表性的Android应用程序源代码!
  • android studio游戏摇杆开发教程,仿王者荣耀摇杆

    万次阅读 多人点赞 2018-06-16 02:48:42
    李子果 原创。。。 最近在做一个山寨版的王者荣耀,刚开始做的时候毫无头绪 摇杆的多点触控做的特别烂 经过几天的思考已完美解决所有问题,下面就和大家分享下这个摇杆的开发思路(此教程不包含游戏源码) ...

    李子果 原创。。。

    最近在做一个山寨版的王者荣耀,刚开始做的时候毫无头绪 摇杆的多点触控做的特别烂

    经过几天的思考已完美解决所有问题,下面就和大家分享下这个摇杆的开发思路(此教程不包含游戏源码)

    若有不正之处,请多多谅解并欢迎指正。

    首先这个摇杆要用到较多的数学知识,小编的数学特别烂也就高中水平吧

    我们这个摇杆一共就五个按钮,一个移动摇杆、三个技能摇杆和一个普通攻击按钮

    最终效果

    好了废话少说让我们开始吧

    新建一个项目

    建好项目之后,我们先新建一个类叫做“画”。也是我们的主View

    修改Hua.java的代码

    public class Hua extends RelativeLayout implements Runnable{ //继承RelativeLayout 实现Runnable接口
    
        private Paint p;//画笔
    
        public Hua(Context context) {
            super(context);
            p=new Paint();
            setBackgroundColor(Color.BLACK);//背景颜色设为黑色
        }
    
        @Override
        protected void onDraw(Canvas g) {//重写onDraw方法
            super.onDraw(g);
        }
    
        @Override
        public void run() {
    
        }
    }

    接下来我们做移动摇杆

     

    我们要准备一张图片(待会我会把图片都丢在附件里)

     

    首先用ps画一个这样半透明的圆ps部分就不做教程了

    把背景隐藏掉 保存为png格式

     

    把我们刚刚制作的图片添加进来

    先新建一个类 my.java

    public class my { //这个类当一个全局变量使用
        public static int w,h;//屏幕的宽高
        public static float bili;
        public static MainActivity main;
        public static RectF re=new RectF();
        public static int ontouchAlpha=100;//触控区透明度0-255 0为透明,为了测试我们先设为100
    }

    修改 MainActivity 的代码

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            my.main=this;
            getSupportActionBar().hide();//隐藏标题栏
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏 隐藏状态栏
            //判断当前是否横屏 如果不是就设为横屏,设为横屏之后会自动调用onCreate方法
            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                //获取屏幕的宽高
                DisplayMetrics dis = getResources().getDisplayMetrics();
                my.w = dis.widthPixels;
                my.h = dis.heightPixels;
                //获取屏幕分辨率和1920*1080的比例 以便适应不同大小的屏幕
                my.bili = (float) (Math.sqrt(my.w * my.h) / Math.sqrt(1920 * 1080));
                setContentView(new Hua(this));
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 横屏
            }
        }
    }

    新建类 Move.java

    package com.yaogan.liziguo.yaogan;
    
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    
    /**
     * Created by Liziguo on 2018/6/15.
     */
    
    public class Move {
        private float x1,y1;//按下时的坐标 大圆
        private float x2,y2;//移动后的坐标 小圆
        private final float r1,r2;//r1大圆的半径 r2小圆的半径
        public float angle;//x1y1指向x2y2的角度 弧度制
        public boolean down=false;//判断是否被按下
        public boolean in=false;//判断小圆是否在大圆里面,简单的说就是防止小圆被脱太远
        public boolean move=false;//判断手指按下后是否移动(MY实际开发中用到,该教程用不到此变量)
        public Bitmap img;//大圆小圆的图片
    
        public Move(){
            r1 = 480 * 0.5f * my.bili;//乘上一个比例 适应不同大小的屏幕
            r2 = 300 * 0.5f * my.bili;
            img= BitmapFactory.decodeResource(my.main.getResources(),R.mipmap.yaogan);//初始化摇杆图片
        }
    
        public void down(float xx,float yy){ //摇杆按下后的操作
            if(xx<r1) x1=r1;
            else x1 = xx;
    
            if(my.h-yy<r1) y1=my.h-r1;
            else y1 = yy;
            //上面的代码是防止按下的位置太靠近屏幕边缘
            //跟x1=xx;y1=yy;区别不大,待会可以改成x1=xx;y1=yy;看看效果有什么不同
            down=true;
        }
        public void move(float xx,float yy){ //按下摇杆后移动的操作
            angle=getAngle(xx,yy);
            in=in(xx, yy);
            move=isMove(xx,yy);
            if (!in) {
                //下面会做解释
                xx= (float) (x1+ Math.sin(angle)*r1*0.7f);
                yy= (float) (y1+ Math.cos(angle)*r1*0.7f);
            }
            x2=xx;
            y2=yy;
        }
        public void up(){ //松开后的操作
            down=false;
        }
    
        public float getAngle(float xx,float yy){ //获取x1y1指向x2y2的角度
            double angle,k;
            if (y1==yy)//斜率不存在时
                if (x1 > xx)//判断x1指向x2的方向
                    angle=-Math.PI/2;
                else
                    angle=Math.PI/2;
            else{
                k=(x1-xx)/(y1-yy); //两点的坐标求斜率,至于为什么是(x1-x2)/(y1-y2)不是(y1-y2)/(x1-x2)待会我们再做解释
                if (y1 > yy) {//判断x1y1指向x2y2的方向
                    // 用反tan求角度 这个高中好像没学过 既然Math类已经帮我们封装好了就直接拿来用吧
                    angle=Math.atan(k) + Math.PI;
                } else {
                    angle=Math.atan(k);
                }
                //这段可写可不写 让计算出来的角度属于-PI/2到PI/2
                if(angle>Math.PI)
                    angle-=Math.PI*2;
                else if(angle<-Math.PI)
                    angle+=Math.PI*2;
            }
            return (float) angle;
        }
    
        public boolean in(float xx, float yy) { //防止小圆被脱太远 拖动范围不超出r1的70%
            double r = Math.sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy));//两点间距离公式
            if (r < r1*0.7f)
                return true;
            else return false;
        }
        public boolean isMove(float xx, float yy) { //判断按下摇杆后 是否移动,如果x1y1 x2y2的距离大于r1*0.15视为移动
            // MY实际开发中用到,该教程用不到此变量
            double r = Math.sqrt((x1 - xx) * (x1 - xx) + (y1 - yy) * (y1 - yy));//两点间距离公式
            if (r > r1*0.15f)
                return true;
            else return false;
        }
        public void onDraw(Canvas g, Paint p){ //画摇杆
            if(down) { //当摇杆被按下时 才显示
                //怎么用Canvas画图这里就不说了
                my.re.left = x1 - r1;
                my.re.top = y1 - r1;
                my.re.right = x1 + r1;
                my.re.bottom = y1 + r1;
                g.drawBitmap(img, null, my.re, p); //画大圆
                my.re.left = x2 - r2;
                my.re.top = y2 - r2;
                my.re.right = x2 + r2;
                my.re.bottom = y2 + r2;
                g.drawBitmap(img, null, my.re, p); //画小圆
            }
        }
    }

    新建类 OnTouchMove.java 

    package com.yaogan.liziguo.yaogan;
    
    import android.content.Context;
    import android.graphics.Color;
    import android.view.MotionEvent;
    import android.view.View;
    
    /**
     * Created by Liziguo on 2018/6/16.
     */
    
    public class OnTouchMove extends View { //这个view负责监听移动摇杆的手势
        
        private Move m;
        
        public OnTouchMove(Context context,Move move) {
            super(context);
            this.m=move;
            setBackgroundColor(Color.WHITE);//背景色设为白色
            getBackground().setAlpha(my.ontouchAlpha);//设置触控区透明度
            setOnTouchListener(new OnTouchListener() { //设置触控监听
                @Override
                public boolean onTouch(View v, MotionEvent ev) {
                    //加上getX() getY()因为这个view不是分布在左上角的
                    final float xx = ev.getX() + getX(), yy = ev.getY() + getY();
    
                    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                        m.down(xx, yy);//按下时的操作
    //                    m.move(xx, yy);
                    }
                    m.move(xx, yy);//移动时的操作
                    if (ev.getAction() == MotionEvent.ACTION_UP) {
                        m.up();//松开时的操作
                    }
                    return true;//不要返回false
                }
            });
        }
    }

    修改 Hua.java 的代码

    package com.yaogan.liziguo.yaogan;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.widget.RelativeLayout;
    
    /**
     * Created by Liziguo on 2018/6/15.
     */
    
    public class Hua extends RelativeLayout implements Runnable{ //继承RelativeLayout 实现Runnable接口
    
        private Paint p;//画笔
        private Move m=new Move();//移动摇杆
    
        public Hua(Context context) {
            super(context);
            p=new Paint();
            setBackgroundColor(Color.BLACK);//背景颜色设为黑色
            //实例化一个OnTouchMove
            OnTouchMove onTouchMove=new OnTouchMove(context,m);
            //把onTouchMove添加进来 宽度为屏幕的1/3 高度为屏幕的1/2
            addView(onTouchMove,my.w/3,my.h/2);
            //设置onTouchMove的位置
            onTouchMove.setX(0);
            onTouchMove.setY(my.h/2);
    
            new Thread(this).start();//启动重绘线程
        }
    
        @Override
        protected void onDraw(Canvas g) {//重写onDraw方法
            super.onDraw(g);
            m.onDraw(g,p);//画移动摇杆
        }
    
        @Override
        public void run() { //每隔20毫秒刷新一次画布
            while(true){
                try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
                postInvalidate();//重绘 在子线程重绘不能调用Invalidate()方法
            }
        }
    }

    好的 现在我们的摇杆可以说已经做好一大半了,因为剩下的原理都一样

    先运行一遍看看效果吧

    左下角的白色矩形是我们的OnTouchMove类,为了更好的测试我们先让他显示出来 等做好了再隐藏掉

    下面我们来解释一下为什么斜率k=(x1-x2)/(y1-y2)而不是(y1-y2)/(x1-x2)吧

    因为我们手机上的平面直角坐标系跟数学上的平面直角坐标系不一样

    数学上的平面直角坐标系是这样的

    而我们手机是这样的

    有没有发现把手机的坐标系 逆时针旋转一下就是数学里的坐标系了,不过x跟y调了一下位置

    所以我们在写代码的时候把x y换一下就行了

    数学坐标系中k=1的直线

    程序中k=1的直线

    再解释下 Move 类的 move方法

     

    public void move(float xx,float yy){ //按下摇杆后移动的操作
            angle=getAngle(xx,yy);
            in=in(xx, yy);
            move=isMove(xx,yy);
            if (!in) {
                //下面会做解释
                xx= (float) (x1+ Math.sin(angle)*r1*0.7f);
                yy= (float) (y1+ Math.cos(angle)*r1*0.7f);
            }
            x2=xx;
            y2=yy;
        }

     

    不知不觉已经凌晨2:46了,今天就写到这吧

     

    明天继续。。。。。。

     

    好的下面我们开始做技能摇杆,这教程做的比较累啊

    下面的技能类是我直接从我游戏里拷贝过来的并做了些小修改

    解释可能没那么清楚毕竟原理都一样

    只不过是多了几个功能而已

     

    准备图片

     

    添加到工程里

    由于图片比较多 我们加载图的代码位置改一下

    修改 MainActivity。java 和 my.java

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            my.main=this;
            getSupportActionBar().hide();//隐藏标题栏
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏 隐藏状态栏
            //判断当前是否横屏 如果不是就设为横屏,设为横屏之后会自动调用onCreate方法
            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                //获取屏幕的宽高
                DisplayMetrics dis = getResources().getDisplayMetrics();
                my.w = dis.widthPixels;
                my.h = dis.heightPixels;
                //获取屏幕分辨率和1920*1080的比例 以便适应不同大小的屏幕
                my.bili = (float) (Math.sqrt(my.w * my.h) / Math.sqrt(1920 * 1080));
                //加载图片
                my.border= BitmapFactory.decodeResource(my.main.getResources(),R.mipmap.border);
                my.cancel= BitmapFactory.decodeResource(my.main.getResources(),R.mipmap.cancel);
                my.down= BitmapFactory.decodeResource(my.main.getResources(),R.mipmap.down);
                my.yaogan= BitmapFactory.decodeResource(my.main.getResources(),R.mipmap.yaogan);
                my.cd= BitmapFactory.decodeResource(my.main.getResources(),R.mipmap.cd);
                setContentView(new Hua(this));
            } else {
                setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 横屏
            }
        }
    }
    public class my { //这个类当一个全局变量使用
        public static int w,h;//屏幕的宽高
        public static float bili;
        public static MainActivity main;
        public static RectF re=new RectF();
        public static int ontouchAlpha=100;//触控区透明度0-255 0为透明,为了测试我们先设为100
    
        public static Bitmap border,cancel,down,yaogan,cd;
    
        public static Skill skill;//当前正在使用的技能 现在会报错 因为我们还没新建技能Skill类
    }

    修改 Move 类的构造方法

        public Move(){
            r1 = 480 * 0.5f * my.bili;//乘上一个比例 适应不同大小的屏幕
            r2 = 300 * 0.5f * my.bili;
    //      img= BitmapFactory.decodeResource(my.main.getResources(),R.mipmap.yaogan);//初始化摇杆图片
            img=my.yaogan;
        }

     

     

    新建技能类 Skill.java

     

     

    package com.yaogan.liziguo.yaogan;
    
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    
    /**
     * Created by Liziguo on 2018/6/16.
     */
    
    public abstract class Skill {
        public int jineng;
        private final float x,y;//技能图标中心位置,不是按下时的位置
        private float x2, y2;//技能按下移动后手指的坐标
        private float xxx,yyy;//判断拖动点是否超出两倍r的范围
        private final float calcelx, cancely;
        public float angle;//技能按下后 x y指向xx yy的角度
        public Bitmap img, imgborder, imgdown, imgyaogan,imgcd,imgcancel;
        private final float r2;
        private final float r3=50*my.bili;
        public boolean down=false;
        public boolean down_main=false;//down_main 只触发一次;
        public boolean cancel=false;
        public int cdmax;
        public long last,cd=0;//last最后一次释放技能的时间
        /*
        0 普通攻击
        1 技能1
        2 技能2
        3 技能3
         */
        public Skill(int jineng, int cd, Bitmap image){
            this.jineng=jineng;
            switch (jineng){
                case 0:
                    x= my.w*0.87f;
                    y= my.h*0.8f;
                    break;
                case 1:
                    x= my.w*0.7f;
                    y= my.h*0.88f;
                    break;
                case 2:
                    x= my.w*0.75f;
                    y= my.h*0.62f;
                    break;
                case 3:
                    x= my.w*0.9f;
                    y= my.h*0.5f;
                    break;
                default:x=y=0;
            }
            cdmax=cd;
            if(jineng == 0) r2=125*my.bili;
            else r2=80*my.bili;
            calcelx =my.w-r2*2;
            cancely =my.h/4;
            img=image;
            imgborder=my.border;
            imgdown=my.down;
            imgyaogan=my.yaogan;
            imgcd=my.cd;
            imgcancel=my.cancel;
        }
        //    public abstract void down();
    //    public abstract void move();
    //    public abstract void up();
        public void down(){ //DOWN 由ontouch触发
            if(cd>0)return;
            down=true;
            my.skill=this;
        }
        public abstract void down_main(); //DOWN 教程用不到该抽象方法
    
        public void move(float x,float y){//按下技能后 由ontouch触发
            x2 =x;
            y2 =y;
            angle=getAngle(x2, y2);
            cancel=incancel(x,y);
            if (jineng !=0 && !in2(x,y)) {
                xxx= (float) (this.x+ Math.sin(angle)*r2*2);
                yyy= (float) (this.y+ Math.cos(angle)*r2*2);
            }else{
                xxx=x;
                yyy=y;
            }
        }
        public abstract void move_main();//按下技能后 由MyActor触发 教程用不到该抽象方法
        public abstract void up(); //松开后 由MyActor触发 释放技能
    
        public boolean in(float xx,float yy){ //判断是否被点中
            double r= Math.sqrt((x - xx)*(x-xx)+(y-yy)*(y-yy));
            if(r<r2)
                return true;
            else return false;
        }
        public boolean in2(float xx, float yy) { //判断拖动点是否超出两倍r的范围
            double r = Math.sqrt((x - xx) * (x - xx) + (y - yy) * (y - yy));
            if (r < r2 * 2)
                return true;
            else return false;
        }
        public boolean incancel(float xx,float yy){ //判断是否取消
            double r= Math.sqrt((calcelx - xx)*(calcelx -xx)+(cancely -yy)*(cancely -yy));
            if(r<r2)
                return true;
            else return false;
        }
        public float getAngle(float xx,float yy){ //x y指向xx yy的角度
            float angle,k;
            if (y==yy)
                if (x > xx)
                    angle= (float) (-Math.PI/2);
                else
                    angle= (float) (Math.PI/2);
            else{
                k=(x-xx)/(y-yy);
                if (y > yy) {
                    angle= (float) (Math.atan(k) + Math.PI);
                } else {
                    angle= (float) Math.atan(k);
                }
                if(angle>Math.PI)
                    angle-=Math.PI*2;
                else if(angle<-Math.PI)
                    angle+=Math.PI*2;
    
            }
            return angle;
        }
        private float drawpx=10*my.bili;
    
        public void next(){
            //计算技能冷却时间
            cd=cdmax-System.currentTimeMillis()+last;
        }
        //按下的时候技能图标下移 显示蓝色框框
        public void onDraw(Canvas g, Paint p){
            my.re.left=x-r2;
            my.re.top=y-r2;
            my.re.right=x+r2;
            my.re.bottom=y+r2;
            if(down){
    //            new RectF(x-r2,y-r2,x+r2,y+r2);
    //            new RectF(x-r2,y-r2+10*my.bili,x+r2,y+r2+10*my.bili);
    //            my.re.left=x-r2;
    //            my.re.top=y-r2;
    //            my.re.right=x+r2;
    //            my.re.bottom=y+r2;
                if(jineng!=0){
                    final float bl=2;
                    my.re.left=x-r2*bl;
                    my.re.top=y-r2*bl;
                    my.re.right=x+r2*bl;
                    my.re.bottom=y+r2*bl;
                    //蓝色框框未下移
                    g.drawBitmap(imgdown,null,my.re,p);
                }
                my.re.left=x-r2;
                my.re.top=y-r2;
                my.re.right=x+r2;
                my.re.bottom=y+r2;
                ///
                //技能图片和技能边框下移
                my.re.top+=drawpx;
                my.re.bottom+=drawpx;
                g.drawBitmap(img,null,my.re,p);
                my.re.left-=drawpx;
                my.re.top-=drawpx;
                my.re.right+=drawpx;
                my.re.bottom+=drawpx;
    
                g.drawBitmap(imgborder,null,my.re,p);
                if(jineng!=0){
                    my.re.left=xxx-r3;
                    my.re.top=yyy-r3;
                    my.re.right=xxx+r3;
                    my.re.bottom=yyy+r3;
                    g.drawBitmap(imgyaogan,null,my.re,p);
                    //cancle
                    my.re.left= calcelx -r2;
                    my.re.top= cancely -r2;
                    my.re.right= calcelx +r2;
                    my.re.bottom= cancely +r2;
                    g.drawBitmap(imgcancel,null,my.re,p);
                }
            }else{
                g.drawBitmap(img,null,my.re,p);
                if(jineng!=0 && cd>0) {
                    p.setTextSize(40*my.bili);
                    p.setColor(Color.WHITE);
                    g.drawBitmap(imgcd,null,my.re,p);
                    float f=cd/100f;
                    f=(int)f;
                    f=f/10;
                    g.drawText(String.valueOf(f),x-p.getTextSize()*4/5,y+p.getTextSize()/3,p);
    
                }
                my.re.left-=drawpx;
                my.re.top-=drawpx;
                my.re.right+=drawpx;
                my.re.bottom+=drawpx;
                g.drawBitmap(imgborder,null,my.re,p);
            }
        }
    }

    新建一个类 OnTouchSkill.java 他也是一个监听view

    这样多点触控会好写很多,刚开始我是用一个view做监听的 写到我心态爆炸。。。

    package com.yaogan.liziguo.yaogan;
    
    import android.content.Context;
    import android.graphics.Color;
    import android.view.MotionEvent;
    import android.view.View;
    
    /**
     * Created by Liziguo on 2018/6/16.
     */
    
    public class OnTouchSkill extends View {
        /*
        A 普通攻击
        Q 技能1
        W 技能2
        E 技能3
        R 没有R
         */
    
        public Skill A,Q,W,E;
    
        public OnTouchSkill(Context context,Skill a,Skill q,Skill w,Skill e) {
            super(context);
            A=a;Q=q;W=w;E=e;
            setBackgroundColor(Color.WHITE);
            getBackground().setAlpha(my.ontouchAlpha);//0-255
            setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent ev) {
                    final float xx = ev.getX() + getX(), yy = ev.getY() + getY();
                    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                        if ( A.in(xx, yy)) {
                            A.down();
                        } else if ( Q.in(xx, yy)) {
                            Q.down();
                        } else if ( W.in(xx, yy)) {
                            W.down();
                        } else if ( E.in(xx, yy)) {
                            E.down();
                        }
    
                    }
                    if (my.skill != null) my.skill.move(xx, yy);
                    if(ev.getAction()==MotionEvent.ACTION_UP){
                        A.down = false;
                        Q.down = false;
                        W.down = false;
                        E.down = false;
                    }
                    return true;
                }
            });
        }
    }

    把监听控件添加到Hua,修改 Hua.java

    package com.yaogan.liziguo.yaogan;
    
    import android.content.Context;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.widget.RelativeLayout;
    
    /**
     * Created by Liziguo on 2018/6/15.
     */
    
    public class Hua extends RelativeLayout implements Runnable{ //继承RelativeLayout 实现Runnable接口
    
        private Paint p;//画笔
        private Move m=new Move();//移动摇杆
    
         /*
        A 普通攻击
        Q 技能1
        W 技能2
        E 技能3
        R 没有R
         */
    
        public Skill A=new Skill(0,100, BitmapFactory.decodeResource(getResources(),R.mipmap.putonggongji)) {
            @Override
            public void down_main() { }
            @Override
            public void move_main() { }
            @Override
            public void up() { }
        };
        public Skill Q=new Skill(1,1000, BitmapFactory.decodeResource(getResources(),R.mipmap.skill1)) {
            @Override
            public void down_main() { }
            @Override
            public void move_main() { }
            @Override
            public void up() {
                down_main=false;
                if(!cancel){ //技能冷却时间
                    last= System.currentTimeMillis();
                }
            }
        };
        public Skill W=new Skill(2,1000, BitmapFactory.decodeResource(getResources(),R.mipmap.skill2)) {
            @Override
            public void down_main() { }
            @Override
            public void move_main() { }
            @Override
            public void up() {
                down_main=false;
                if(!cancel){
                    last= System.currentTimeMillis();
                }
            }
        };
        public Skill E=new Skill(3,1000, BitmapFactory.decodeResource(getResources(),R.mipmap.skill3)) {
            @Override
            public void down_main() { }
            @Override
            public void move_main() { }
            @Override
            public void up() {
                down_main=false;
                if(!cancel){
                    last= System.currentTimeMillis();
                }
            }
        };
    
        public Hua(Context context) {
            super(context);
            p=new Paint();
            setBackgroundColor(Color.BLACK);//背景颜色设为黑色
            //实例化一个OnTouchMove
            OnTouchMove onTouchMove=new OnTouchMove(context,m);
            //把onTouchMove添加进来 宽度为屏幕的1/3 高度为屏幕的1/2
            addView(onTouchMove,my.w/3,my.h/2);
            //设置onTouchMove的位置
            onTouchMove.setX(0);
            onTouchMove.setY(my.h/2);
    
            //添加技能摇杆监听
            OnTouchSkill onTouchSkill=new OnTouchSkill(context,A,Q,W,E);//后添加的优先级高
            addView(onTouchSkill);
            onTouchSkill.setX(my.w*0.7f-85*my.bili);
            onTouchSkill.setY(my.h/2-85*my.bili);
            new Thread(this).start();//启动重绘线程
        }
    
        @Override
        protected void onDraw(Canvas g) {//重写onDraw方法
            super.onDraw(g);
            m.onDraw(g,p);//画移动摇杆
            //画技能
            A.onDraw(g,p);
            Q.onDraw(g,p);
            W.onDraw(g,p);
            E.onDraw(g,p);
        }
    
        @Override
        public void run() { //每隔20毫秒刷新一次画布
            while(true){
                try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}
                //计算冷却时间
                A.next();
                Q.next();
                W.next();
                E.next();
                //释放技能
                if (my.skill != null) {
                    my.skill.down_main();//教程用不到该方法
                    my.skill.move_main();//教程用不到该方法
                    if (my.skill.down == false) {
                        my.skill.up();
                        my.skill = null;
                    }
                }
    
                postInvalidate();//重绘 在子线程重绘不能调用Invalidate()方法
            }
        }
    }

    运行下看看效果吧

    修改 my.java

    public class my { //这个类当一个全局变量使用
        public static int w,h;//屏幕的宽高
        public static float bili;
        public static MainActivity main;
        public static RectF re=new RectF();
        public static int ontouchAlpha=0;//把触控区透明度改成0
    
        public static Bitmap border,cancel,down,yaogan,cd;
    
        public static Skill skill;//当前正在使用的技能
    }

     

    再运行下

     

    大功告成

    下载地址:https://download.csdn.net/download/u010756046/10482434

    PS:图片不要太大 尽量压缩到20kb以下,不然使用摇杆会很卡

     

    展开全文
  • 总是听到有人说AndroidX,到底什么是AndroidX?

    万次阅读 多人点赞 2019-08-26 08:06:59
    Android技术迭代更新很快,各种新出的技术和名词也是层出不穷。不知从什么时候开始,总是会时不时听到AndroidX这个名词,这难道又是什么新出技术吗?相信有很多朋友也会存在这样的疑惑,那么今天我就来写一篇科普...

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每个工作日都有文章更新。

    Android技术迭代更新很快,各种新出的技术和名词也是层出不穷。不知从什么时候开始,总是会时不时听到AndroidX这个名词,这难道又是什么新出技术吗?相信有很多朋友也会存在这样的疑惑,那么今天我就来写一篇科普文章,向大家介绍AndroidX的前世今生。

    Android系统在刚刚面世的时候,可能连它的设计者也没有想到它会如此成功,因此也不可能在一开始的时候就将它的API考虑的非常周全。随着Android系统版本不断地迭代更新,每个版本中都会加入很多新的API进去,但是新增的API在老版系统中并不存在,因此这就出现了一个向下兼容的问题。

    举个例子,当Android系统发布到3.0版本的时候,突然意识到了平板电脑的重要性,因此为了让Android可以更好地兼容平板,Android团队在3.0系统(API 11)中加入了Fragment功能。但是Fragment的作用并不只局限于平板,以前的老系统中也想使用这个功能该怎么办?于是Android团队推出了一个鼎鼎大名的Android Support Library,用于提供向下兼容的功能。比如我们每个人都熟知的support-v4库,appcompat-v7库都是属于Android Support Library的,这两个库相信任何做过Android开发的人都使用过。

    但是可能很多人并没有考虑过support-v4库的名字到底是什么意思,这里跟大家解释一下。4在这里指的是Android API版本号,对应的系统版本是1.6。那么support-v4的意思就是这个库中提供的API会向下兼容到Android 1.6系统。它对应的包名如下:

    类似地,appcompat-v7指的是将库中提供的API向下兼容至API 7,也就是Android 2.1系统。它对应的包名如下:

    可以发现,Android Support Library中提供的库,它们的包名都是以android.support.*开头的。

    但是慢慢随着时间的推移,什么1.6、2.1系统早就已经被淘汰了,现在Android官方支持的最低系统版本已经是4.0.1,对应的API版本号是15。support-v4、appcompat-v7库也不再支持那么久远的系统了,但是它们的名字却一直保留了下来,虽然它们现在的实际作用已经对不上当初命名的原因了。

    那么很明显,Android团队也意识到这种命名已经非常不合适了,于是对这些API的架构进行了一次重新的划分,推出了AndroidX。因此,AndroidX本质上其实就是对Android Support Library进行的一次升级,升级内容主要在于以下两个方面。

    第一,包名。之前Android Support Library中的API,它们的包名都是在android.support.*下面的,而AndroidX库中所有API的包名都变成了在androidx.*下面。这是一个很大的变化,意味着以后凡是android.*包下面的API都是随着Android操作系统发布的,而androidx.*包下面的API都是随着扩展库发布的,这些API基本不会依赖于操作系统的具体版本。

    第二,命名规则。吸取了之前命名规则的弊端,AndroidX所有库的命名规则里都不会再包含具体操作系统API的版本号了。比如,像appcompat-v7库,在AndroidX中就变成了appcompat库。

    一个AndroidX完整的依赖库格式如下所示:

    implementation 'androidx.appcompat:appcompat:1.0.2'
    

    了解了AndroidX是什么之后,现在你应该放轻松了吧?它其实并不是什么全新的东西,而是对Android Support Library的一次升级。因此,AndroidX上手起来也没有任何困难的地方,比如之前你经常使用的RecyclerView、ViewPager等等库,在AndroidX中都会有一个对应的版本,只要改一下包名就可以完全无缝使用,用法方面基本上都没有任何的变化。

    但是有一点需要注意,AndroidX和Android Support Library中的库是非常不建议混合在一起使用的,因为它们可能会产生很多不兼容的问题。最好的做法是,要么全部使用AndroidX中的库,要么全部使用Android Support Library中的库。

    而现在Android团队官方的态度也很明确,未来都会为AndroidX为主,Android Support Library已经不再建议使用,并会慢慢停止维护。另外,从Android Studio 3.4.2开始,我发现新建的项目已经强制勾选使用AndroidX架构了。

    那么对于老项目的迁移应该怎么办呢?由于涉及到了包名的改动,如果从Android Support Library升级到AndroidX需要手动去改每一个文件的包名,那可真得要改死了。为此,Android Studio提供了一个一键迁移的功能,只需要对着你的项目名右击 → Refactor → Migrate to AndroidX,就会弹出如下图所示的窗口。

    这里点击Migrate,Android Studio就会自动检查你项目中所有使用Android Support Library的地方,并将它们全部改成AndroidX中对应的库。另外Android Studio还会将你原来的项目备份成一个zip文件,这样即使迁移之后的代码出现了问题你还可以随时还原回之前的代码。

    好了,关于AndroidX的内容就讲到这里,相信也是解决了不少朋友心中的疑惑。由于这段时间以来一直在努力赶《第一行代码 第3版》的进度,所以原创文章的数量偏少了一些,也请大家见谅。


    关注我的技术公众号,每个工作日都有优质技术文章推送。

    微信扫一扫下方二维码即可关注:

    展开全文
  • android 经典代码例子

    万次下载 热门讨论 2011-06-14 15:12:17
    android 经典代码例子,若干个。。。。
  • Android BLE开发之Android手机与BLE终端通信 程序文件

    千次下载 热门讨论 2014-04-21 20:06:20
    Android 4.3才开始支持BLE API,所以请各位客官把本文代码运行在蓝牙4.0和Android 4.3及其以上的系统,另外本文所用的BLE终端是一个蓝牙4.0的串口蓝牙模块。 PS:我的i9100刷了4.4系统后,竟然也能跟BLE蓝牙模块通信...
  • Android面试系列2018总结(全方面覆盖Android知识结构)   拿到一份offer比什么都重要,所以笔者专门花了近一个月的时间整理好了一份专门为Android面试而生的总结,注意的是笔者仅仅对面试技术方面的题目进行的...

    Android知识体系总结(全方面覆盖Android知识结构,面试&进阶 Version-3.0.0 时间:2020.05)

    此篇文章是初中高级工程师学习文章,知识体系较为完整。有如下特点:
    [1]知识结构全面
    [2]跟随当下技术潮流实时更新
    [3]可用于面试 & 学习
    [4]知识分为文字部分和视频部分,任性选择
    [5]正确的职业规划
    [6]方便工作过程中遗忘知识点快速查询

    这份知识体系大纲包括:

    Android部分:

    • 四大组件篇
      Activity
      BroadcastReceiver
      ContentProvider
      Service

    • 第五大组件篇
      Fragment

    • 对话框 & 弹框 & 悬浮窗 & 通知篇
      Dialog
      PopWindow
      DialogFragment
      Notification

    • Android UI控件篇
      基础布局
      基础控件
      高级控件(ListView,RecyclerView,ViewPager,WebView…)
      自定义控件(包含很多其它知识)
       Android坐标系
       Android的角度与弧度
       View绘制机制
       View事件分发
       Android动画机制
       Canvas类
       Path类
       贝塞尔曲线
       …
      原生控件源码分析

    • Android系统架构篇
      系统架构
      系统版本特点 & 区别

    • Android通信篇
      线程间通信框架Handler
       AsyncTask
       HandlerThread
       IntentService
      进程间通信

    • Android网络编程篇
      网络请求
      Token & Session & Cookie三者联系与区别
      数据解析[Json,XML]

    • Android数据持久化篇
      文件存储
      key-value存储[SharePreference,MMKV(腾讯)]
      数据库存储[SQL语句,SQLite]
      序列化

    • Android 原生音视频图片开发[非JNI]
      图片开发(Bitmap)
      视频开发[GsyPlayer,JiaoZiPlayer…]
      音频开发[MediaPlayer]

    • Android特殊知识点【不知道如何分类的知识点】
      gradle
      蓝牙
      定位
      SDK开发与接入
      Drawable

    • Android必须掌握的轮子
      异步通信[EventBus,RxJava]
      图片加载[Glide,Picasso,Fresco]
      内存优化[LeackCanary,BlockCanary]
      依赖注入[ButterKnife,Dagger]
      数据库轮子[LitePal,GreenDao…]

    • 项目架构篇
      MVC & MVP & MVVM
      组件化
      JetPack

    • Android高级进阶篇
      UI绘制过程
      一个app启动过程
      Android 动画机制
      View事件分发
      热更新 & 插件化
      Handler源码分析

    • Android优化篇
      内存优化
      布局优化
      UI卡顿优化
      UI适配优化
      apk安全优化

    • Android职业方向篇【这是笔者新加入的,对于Andorid开发者而言非常重要,要有自己的职业规划】
      资深UI工程师[自定义控件,源码方向]
      Android底层开发工程师[C++音视频/图像算法/智能家居]
      Android资深架构师[造得一手牛逼的好轮子,熟悉Framework,Java高级知识等等]
      全栈工程师(以Android为核心技术)

    • Android工作工具篇
      Git/SVN(代码版本控制)
      调试工作
      测试

    • Android工作必备技能篇
      玩转Gradle
      打包 & 多渠道打包
      加固 & 混淆

    • Android跨平台开发篇
      WebView & 第三方内核
      Flutter

    • Android项目学习篇
      实战项目学习


    Java部分

     基础部分

    • 操作系统
    • 八大基本数据类型&引用类型
    • JDK&JRE&JVM篇
    • 面向过程&面向对象篇
    • 数组
    • NIO/BIO/AIO
    • Java异常体系篇
    • 集合篇
    • 多线程篇
    • 泛型篇
    • Java注解篇
    • 反射篇
    • Socket
    • Java设计模式篇

     高级部分

    • JVM
    • AOP
    • APT
    • 多线程核心知识点

    Kotlin部分:

    基础部分

    • 基本数据类型
    • 数组
    • 集合
    • 函数
    • 类 & 接口
    • 扩展方法
    • 空类型安全
    • 智能类型转换

    高级部分

    • 泛型
    • 反射
    • 注解
    • 协程

    数据结构与算法部分

     数据结构部分

    • 时间复杂度 & 空间复杂度
    • 数组
    • 链表
    • 队列
    • 散列表

     算法部分

    • 排序(8大排序)
    • 查找
    • 递归 & 回溯算法
    • 贪心算法

    计算机网络部分

    • 五层网络模型
    • http[请求头,响应体,三次握手,四次挥手等]
    • https
    • DNS
    • Socket & WebSocket
    • 浏览器访问一个url的过程
    • Android技术应用【Andorid中能运用的网络知识点】

    Android面试部分

    • Java部分
    • Kotlin部分
    • Android部分
    • 移动UI框架部分(Flutter为主)
    • 数据结构与算法部分
    • 常用的开源库部分
    • 计算机网络认识

    以下是Android面试系列文章知识体系图以及文章的具体链接:
    Android面试系列文章知识体系图:
    2018年3月份(Version-1.0.0):

    • 链接:https://pan.baidu.com/s/1qoyOI14bAjn2lMRr-toAag 密码:4qv9、
    • CSDN下载链接:http://download.csdn.net/download/clandellen/10277364
      既然选不了0积分下载,最低需要2积分下载,CSDN官方规定最少2积分,对不起读者了

    2018年9月份(Version-1.0.1):

    • 链接:https://pan.baidu.com/s/1g7WE-FoXXqr8-dPXLjjTLA 提取码:mg78
    • CSDN下载链接:https://download.csdn.net/download/clandellen/10698579 (5积分,这次积分高了些,就算对笔者辛苦整理的奖励吧,但是你没有积分的话,去百度云下载吧,就在上面)

    1.Android部分

    1.1 Android四大组件篇

    Android知识体系总结之Android部分之Activity篇
    CSDN
    开源中国

    Android知识体系总结之Android部分之Broadcast篇
    CSDN
    开源中国

    Android知识体系总结之Android部分之ContentProvider篇
    CSDN
    开源中国

    Android知识体系总结之Android部分之Service篇
    CSDN
    开源中国

    1.2 第五大组件Fragment

    Android知识体系总结之Android部分之Fragment篇
    CSDN
    开源中国

    1.3 对话框 & 弹框 & 通知 & 悬浮窗

    CSDN
    开源中国

    1.4 Android控件篇

    Android知识体系总结之Andorid部分Android控件篇
    CSDN
    开源中国

    1.5 Android系统架构篇

    CSDN
    开源中国

    1.6 Android通信篇

    CSDN
    开源中国

    1.7 Android数据持久化篇

    CSDN
    开源中国

    1.8 Android网络编程篇

    CSDN
    开源中国

    1.9 原生音视频图片开发篇[非JNI]

    CSDN
    开源中国

    1.10 Android特殊知识点【不知道如何分类的知识点】

    CSDN
    开源中国

    1.11 Android必须掌握的轮子

    CSDN
    开源中国

    1.12 Android架构篇

    CSDN
    开源中国

    1.13 Android高手进阶篇

    CSDN
    开源中国

    1.14 Android优化篇

    CSDN
    开源中国

    笔者不断更新:AndroidOp【Android优化总结】

    1.15 Android职业方向篇(有正确的职业方向,才能不浪费自己的职业生涯)

    资深UI工程师(自定义控件)
    Android底层开发工程师(C/C++/JNI/音视频图片算法开发等)
    Android资深架构师
    全栈工程师(以Android为核心技术力)

    1.16 Android工作工具篇

    CSDN
    开源中国

    1.17 Android工作必备技能篇

    CSDN
    开源中国

    1.18 Android跨平台开发篇

    CSDN
    开源中国

    1.19 Android项目实战篇

    2.Java部分

    Android 开发者 Java学习篇(内含高级知识部分)

    3.Kotlin部分

    Android 开发者 Kotlin学习篇

    4.算法与数据结构部分

    Android 开发者 数据结构与算法篇

    AndroidDataStructure【GitHub上总结的】

    5.计算机网络部分

    Android 开发者 计算机网络篇

    6.Android面试部分

    面试题集合,面试季更新

    一个GitHub受欢迎的Android第三方库整理的网站,读者可以收藏一下,高效率开发

    展开全文
  • Android ConstraintLayout 约束布局详解

    万次阅读 多人点赞 2017-03-17 19:53:38
    本文出自【赵彦军的博客】 前言在2016年的Google I/O大会上 , Google 发布了Android Studio 2.2预览版,同时也发布了Android 新的布局方案 ConstraintLayout , 但是最近的一年也没有大规模的使用。2017年
  • 最新android ADT-21.1.0 绿色版

    千次下载 热门讨论 2013-02-16 08:45:40
    最新android ADT-21.1.0 绿色版
  • Android实现ListView的A-Z字母排序和过滤搜索功能,完整源码,小伙伴需要的来CSDN下载吧!项目详情http://blog.csdn.net/xiaanming/article/details/12684155
  • Android组件设计思想

    万次下载 热门讨论 2013-10-23 01:11:07
    Android应用开发的哲学是把一切都看作是组件。把应用程序组件化的好处是降低模块间的耦合性,同时提高模块的复用性。Android的组件设计思想与传统的组件设计思想最大的区别在于,前者不依赖于进程。也就是说,进程...
  • android的XMPP客户端

    千次下载 热门讨论 2013-09-06 16:04:32
    android的XMPP客户端
  • Android 串口编程

    千次下载 热门讨论 2011-11-28 23:28:32
    Android 串口编程,《Android 串口编程原理和实现方式》代码
  • Android基于Socket聊天最终版

    千次下载 热门讨论 2012-10-08 23:00:01
    Android之基于socket聊天小项目,包含服务器、客户端、数据库文件以及个人测试的截图。最后一次修改了,开始上班了,不弄了,谢谢大家。
  • Android游戏源码大合集(主要是AndEngine和Libgdx的)

    万次下载 热门讨论 2012-04-14 14:23:27
    最近在网络上看到有网友抱怨Android游戏源码找不到,所以小弟收集了一些AndEngine和Libgdx的游戏源码,以Eclipse工程的形式配置好环境,再陆续发出(某引擎避嫌,不在此列)。 虽说主要是由Libgdx与AndEngine开发的...
  • Android Studio安装配置详细步骤(超详细)

    万次阅读 多人点赞 2020-10-06 20:36:00
    当我们开始学习安卓开发时,必不可少的第一步安装这个开发Android 程序所需的工具,接下来我们就手把手带你安装Android tudio。 {激动}
  • 编写不易,如有转载,请声明...  昨晚自己弄了一会儿没弄出来,就想着明天打开电脑打开AS,Android Monitor应该会自己调出来的,结果没出来…问题解决  我的整个恢复操作是这样的(2M gif时间有限 操作较快勿怪):
  • Android第一天 安装Android Studio 3.5

    万次阅读 多人点赞 2018-03-09 11:26:38
    1.获取Android Studio 3.5 方式1:进入Android Developers官方网站下载; 方式2:进入Android Studio中文社区下载(当前最新为3.4.1); 方式3:进入Android Dev Tools网站下载。 高速通道:(小白直接戳以下...
  • Android蓝牙通信

    千次下载 热门讨论 2011-12-09 17:22:11
    Android蓝牙通信,连个手机直接通信,收发数据,界面简洁友好,代码易懂。使用的是虚拟串口通信,波特率9600,也可以和其他非手机端蓝牙设备通信,只要使用协议相同就行了。我的博客有说明...
  • 通往Android的神奇之旅

    万人学习 2016-04-14 16:12:58
    本套Android课程,大家可以一路学习基本控件,控件,网络,自定义View,地图,推送,后端云,项目实战2048游戏等等,通过本套课程,相信大家可以基本掌握Android入门知识。
  • Android省市区三级联动滚轮选择——Cascade_Master

    万次下载 热门讨论 2014-11-27 18:15:10
    从真实项目中提取出来的,Android省市区三级联动滚轮选择组件,基于开源组件Android-wheel来实现,效果非常不错,可以直接拿去用。
  • Android support.v7包

    万次下载 热门讨论 2015-04-14 20:28:30
    Android support.v7包
  • Android Studio安装教程(超级详细)

    万次阅读 多人点赞 2020-08-28 12:02:04
    Android Studio安装教程(超级详细)欢迎使用Markdown编辑器获取Android Studio安装Android Studio 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown...
  • android串口demo

    千次下载 热门讨论 2013-03-30 14:35:05
    这是很据android-serialport-api 自己简化的一个demo ,可以使用。原来android-serial-api的程序很多人反映都不能使用,所以自己写了这个,只有一个activity。
  • Android串口通信(Android Studio)

    千次下载 热门讨论 2017-12-21 15:20:53
    Android串口通信(Android Studio) serial Port 简单的demo 好久之前整的
  • Android开发:shape和selector和layer-list的(详细说明)

    万次阅读 多人点赞 2013-08-02 09:59:44
    shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector。可以这样说,shape和selector在美化控件中的作用是至关重要的。 1.Shape ...
  • Android Studio 下载安装教程

    万次阅读 多人点赞 2019-09-03 16:02:10
    Android Studio —— DOWNLOAD —— DOWNLOAD ANDROID STUDIO(来进行下载,下载的是最新版本) 勾选同意协议,点击开始下载 三 安装Android Studio 1.双击安装软件,打开后点击Next继续下一步;...
  • Android仿QQ登录界面示例,实现登录、注册功能。

    万次阅读 多人点赞 2018-08-28 17:58:22
    Android开发经常用到注册、登录功能,于是便整理出一般通用的登录界面,并实现其相应功能。供读者参阅。此项目包含三个活动,即登录,注册界面,找回密码。 首先是登录界面 activity_main.xml: &lt;?...
  • Android SDK 中文帮助文档

    千次下载 热门讨论 2011-11-07 23:41:54
    目前最全的Android中文帮助文档,感谢Android中文翻译组

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,382,253
精华内容 1,352,901
关键字:

androi