精华内容
下载资源
问答
  • android studio安装教程

    万次阅读 多人点赞 2019-07-16 12:23:50
    百度搜索Android studio,或者直接输入http://www.android-studio.org进入这个页面 根据这个下载相应的安装包或者压缩包。 这里演示安装64位的android studio 下载完成后直接双击安装包,就会出来...

    遇到问题请往下看!!!

    百度搜索Android studio,或者直接输入http://www.android-studio.org进入这个页面

     

     

     

    根据这个下载相应的安装包或者压缩包。

     

     

    这里演示安装64位的android studio

    下载完成后直接双击安装包,就会出来下面这个界面

    点击Next

     

    点击Next

     

     

    点击Next

     

     

    点击install

     

     

    等待进度条走完

     

     

    点击Next

     

     

    点击finish

     

     

    选择第二个,点击ok

     

     

    两个都可以,我点击Don’t  send

     

     

    点击Cancel

     

     

    点击Next

     

     

    选择第一个,点击Next

     

     

    选择你想要的主题颜色,点击Next

     

     

    点击Finish

     

     

    进度条走完后点击Finish

     

     

    点击第一个新建项目

     

     

    点击Next

     

     

    点击Finish

     

     

    这个有可能下载不下来

     

     

     

    解决办法

    进入https://services.gradle.org/distributions/下载对应版本的gradle

    把Android stutid关掉

    进入到C盘C:\Users\ASUS\.gradle\wrapper\dists\gradle-5.1.1-all\97z1ksx6lirer3kbvdnh7jtjg把里面的文删掉(是哪个版本的gradle就选择哪个版本的文件夹)

    把下载下来的gradle放到这个文件夹(不要解压gradle,直接放进去

    打开Android stutio

    点击这个进行重构

    有可能因为网络问题,项目构建失败,请看教程的最下面的解决方法

    这个变成绿色就说明项目创建成功,可以运行了

     

     

    点击这个新建模拟器

     

     

     

     

    选择完之后点击Next

     

     

    点击Download下载你想要的系统,下载完之后选中,点击Next

     

     

    点击Finish

     

     

    启动

     

     

    点击之后选择手机点ok就会运行到模拟器上。

     

     

    运行成功

     

    问题记录

    问题1:

    日期2020/3/3

    错误提示Cause:unable to find valid certification path to requested target

    原因:网络问题,目标服务器在国外,有时会出现下载不下来的情况

    解决办法:在build.gradle里面把原来的google()和jcenter()方法注释掉添加阿里云的镜像

    maven { url 'https://maven.aliyun.com/nexus/content/repositories/google' }
    maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
    maven{ url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}

    示例:

    添加完之后一定要点右上角Sync now,如果出现错误继续点重构,不行就多点几次。

     

    展开全文
  • 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 !第一个程序完成!
    不用任何操作!
    在这里插入图片描述

    展开全文
  • visual studio2019的安装以及使用

    万次阅读 多人点赞 2019-07-22 11:12:55
    选择visual studio 2019的community版本 二、下载好后运行 三、组件的选择 如果是用来学C\C++的话,选择以下两个就够了 之后如果还需要其他一些功能的话,可以后续在进行添加。打开visual studio Installer,...
    一、下载安装包

    下载地址
    选择visual studio 2019的community版本
    在这里插入图片描述

    二、下载好后运行

    在这里插入图片描述

    三、组件的选择

    如果是用来学C\C++的话,选择以下两个就够了
    在这里插入图片描述
    在这里插入图片描述
    之后如果还需要其他一些功能的话,可以后续在进行添加。打开visual studio Installer,进入修改在这里插入图片描述

    四、进行安装

    如果不需要修改安装位置的话点击安装就可以了。不过由于vs2019占用的空间较大最好不要装在C盘。可以在安装位置修改安装的路径。

    在这里插入图片描述

    五、VS2019的使用
    • 创建一个project
      在这里插入图片描述
      选择创建一个空项目。这里虽然是c++语言,但可以兼容c语言的,所以不用担心。
      在这里插入图片描述
      在这里插入图片描述
    • 写测试程序
      右击源文件添加一个新文件
      在这里插入图片描述
      在这里插入图片描述
      现在就可以开始写代码了。
      在这里插入图片描述
      编译方法如下图所示
      在这里插入图片描述
      运行程序如下图所示
      在这里插入图片描述
      运行结果
      在这里插入图片描述
      ps:推荐使用CMake项目VS2019CMake项目的简单使用
    展开全文
  • 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以下,不然使用摇杆会很卡

     

    展开全文
  • Visual Studio 2019 C语言程序(VS2019 C语言)

    万次阅读 多人点赞 2019-08-01 18:03:59
    Visual Studio 2019 C语言程序(VS2019 C语言)
  • 文章目录Visual Studio Code安装及C/C++环境配置前言一、Visual Studio Code下载及安装1.Visual Studio Code的下载2.Visual Studio Code汉化二、编程环境的配置1.环境准备2.关于插件3.四个.json文件的配置总结 前言 ...
  • Android Studio 下载安装教程

    万次阅读 多人点赞 2019-09-03 16:02:10
    Android Studio —— DOWNLOAD —— DOWNLOAD ANDROID STUDIO(来进行下载,下载的是最新版本) 勾选同意协议,点击开始下载 三 安装Android Studio 1.双击安装软件,打开后点击Next继续下一步;...
  • Android Studio安装教程(超级详细)

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

    万次阅读 2018-08-29 10:16:21
    国内依然无法访问 android.com,那如何从官方下载android studio呢? 解决方案 下载迅雷加速下载(网速快的,直接略过本步骤)。预计耗时:1分钟 在浏览器或者迅雷中打开如下网址进行下载。预计耗时:30分钟...
  • Android Studio 3.5 汉化包

    万次阅读 多人点赞 2017-10-31 16:34:19
    Android Studio 3.0-3.1 汉化包 CLion 2018.1 汉化包 GoLand 2017.3.2-2018.1 汉化包 IntelliJ IDEA 2017.3-2018.1 汉化包 PhpStorm 2017.3-2018.1 汉化包 PyCharm 2017.3-2018.1 汉化包 RubyMine 2017....
  • 下载: Anderson Studio是Google为Android提供的官方IDE工具,下载地址:http://www.android-studio.org/ 安装环境要求 : 其中JDK的最低版本是1.7,所以系统空闲内存至少2GB。...以android-studio-id...
  • 1.安装VisualStudio2015 配置完cl.exe还是不行 2.作者源代码编译 还是不行 3.导入别人的whl还是不行 4.pip和anaconda命令 网上各种方式都试过都不行 以下是较为简单的正确安装步骤: 1.安装...
  • Android Studio 3.5正式版已经发布了,同时gradle的版本也进行了更新。跟往常一样,在AS上下载gradle的速度实在是太慢了,导致项目一直无法编译,在此将下载出来的gradle-5.4.1分享出来:gradle-5.4.1-all.zip ...
  • Android Studio入门教程(新手必看)

    万次阅读 多人点赞 2020-10-07 15:26:39
    上篇文章已经说过了Android Studio的安装配置,从这里开始我们就来完成第一个Android项目吧! 如何安装配置还不太熟悉的可以参考这篇文章:Android Studio安装配置详细步骤(超详细)   让我们开始第一个Android...
  • Zend+Studio+11.0破解文件和注册机 绿色版

    千次下载 热门讨论 2014-07-23 23:18:24
    Zend+Studio+11.0破解文件和注册机
  • 第一步,Android Studio File Explorer 不显示内容,参考:http://blog.csdn.net/u013553529/article/details/54292956 第二步,内容显示了,但仍然不能查看里面内容,做法如下: adb shell su root chmod 777 data cd data...
  • Android Studio SVN提交代码

    万次阅读 2019-11-07 09:51:53
    Android Studio SVN Commit Code 1. 引言 1.1 为什么用Android Studio提交代码? Android Studio 在开发过程中生成很多根据当前开发环境生成的配置文件,如果将开发的代码及配置文件全部提交,很可能会导致别人check...
  • Android Studio安装及环境配置教程

    万次阅读 多人点赞 2019-04-25 20:50:42
    第一步:新建一个androidstudio,在这个文件夹下新建sdk, studio, work,     第二步,运行安装包,在资料里面。   如下图,点击next   如下图,默认全选,点击next   如...
  • Android Studio入门指南

    千次下载 热门讨论 2013-11-06 09:00:08
    历上最全,全球首本Android Studio入门指南,如有任何问题,请联系我. 博客:blog.csdn.net/wirelessqa 来往:hello_xiaopeng 如果没有分,留下邮箱,我可以直接把书发给你。哈哈!
  • Visual Studio 2017下载地址和安装教程(图解版)

    万次阅读 多人点赞 2018-09-13 21:40:18
    Visual Studio 2017下载地址和安装教程(图解版) Visual Studio 2017不仅支持C#、C++、Python、Visual Basic、Node.js、HTML、JavaScript等各大编程语言,还能开发 iOS、Android 的移动平台应用,Visual Studio ...
  • visual studio 和visual studio code 的区别

    万次阅读 2020-02-11 11:39:23
    Visual Studio(简称VS)是美国微软公司的开发工具包系列产品,是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等。通俗的讲,是一款...
  • Visual Studio Code + PyQt5环境搭建

    万次阅读 2020-12-18 13:59:46
    Visual Studio Code + PyQt5环境搭建 文章目录Visual Studio Code + PyQt5环境搭建前言1、PyQt5工具包安装2、Visual Studio Code配置3、Visual Studio Code里使用PyQt54、总结 前言 记录一下学习QT时,环境搭建得...
  • zend studio 12 破解 注册码 key 绿色版

    千次下载 热门讨论 2014-12-27 10:06:05
    zend studio 12官网下载地址,破解 key 注册码,绝对可用,且操作简单。仅供研究、测试和学习,不得用于商业等非法用途,支持购买正版。
  • Visual Studio 2019中的安装问题详细解决方法前言安装地址下载网址问题解决1、连接热点2、改DNS 前言 因为最近要学习C++和C#,所以在寻找了很多编程软件后,感觉Visual Studio 2019应该是目前蛮好用的编程软件,不仅...
  • visual studio 2019安装教程(C++版)

    万次阅读 多人点赞 2020-04-26 13:05:24
    百度登visual studio 官网 选择社区版community 下载安装包 选择模块,C++选择打钩的两个即可 右下角,选择全部下载完后安装 安装完后打开,界面样式四选一 注册一个微软账号 打开visual studio,选择创建新...
  • Android Studio设置HTTP代理(可用)

    万次阅读 2018-06-14 10:29:32
    Android开发工具的网站,上面链接是Studio的canary渠道,列出了Studio各种实时预览版等,目前最新的是1.0RC版本。 大陆的墙很厚很高,初次安装AndroidStudio下载SDK等必定失败,设置代理方法如下: 1. 到android...
  • Android Studio 开发详解

    万人学习 2016-09-21 00:57:54
    Android Studio教程,该教材会详细介绍Android Studio如何使用,包括在Windows平台下载安装Android Studio、配置、代码重构、项目调试、jar包管理等。
  • Visual Studio 2017安装使用方法

    万次阅读 多人点赞 2019-01-08 10:41:45
    首先下载Visual Studio 2017的安装包。如果有微软账号,可以下载Community版本,适用于个人学习和开发。如果对开发环境有更高要求,或者进行团队开发,可以下载Professional版本或者Enterprise版本,此两个版本需要...
  • gradle-1.6-bin.zipAndroid studio 所需官方绿色包

    万次下载 热门讨论 2013-05-17 11:21:49
    Android studio 所需的包,离线方式使用。
  • 在使用AndroidStudio时,项目用到的图片资源存放的位置,是放在drawable下? 还是放在mipmap下?其实google官方已经给出相关介绍: drawable/ For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 916,509
精华内容 366,603
关键字:

studio