这个没有要本地跑的
最好是自定义view
问题已解决,这个权限比较特殊,仅仅配置运行时权限是不够的,需要将用户引导到手机设置中,打开某个特殊的设置才可以。
class DoubleTapRunnable implements Runnable{ @Override public void run() { currentProgress++; if(currentProgress <= progress) { invalidate(); handler.postDelayed(doubleTapRunnable,50); } else { handler.removeCallbacks(doubleTapRunnable); currentProgress = 0; } } }
假如在双击的执行动画中单击,currentProgress在单击事件中被赋值为50,而此时双击线程DoubleTapRunnable还未结束会进入到if(currentProgress <= progress)重绘一次,50ms后进入下一次双击线程,此时进入else块,双击线程的回调被remove,而currentProgress也被赋值为0。单击线程中又会调用invalidate();进行重绘,导致单击动画只有刚刚进入的一瞬间进度为50,而余下的绝大部分时间进度都为0
至于为什么双击动画结束后再单击不会出现这样的BUG
双击结束后会执行双击线程中else块中的这两个语句
handler.removeCallbacks(doubleTapRunnable);
currentProgress = 0;
此时双击线程的回调已被移除(remove),然后单击为currentProgress赋值为50,动画是正常的
总的来说就是双击和单击这两个线程的执行时间和顺序的问题。
canvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2, circlePaint);
修改第一个和第二个参数即可
确认自己已继承某个View/ViewGroup,确定你的onDraw方法在添加@Override注解后,Android Studio/Eclipse不会报警告,错误提示。所以猜测如下:
你没有继承特定的View,没有继承是没有这个方法回调的
你的onDraw(Canvas c)不是系统提供的,而是你自己定义的一个重载方法,如果是重载添加@Override注解是会报警告的
你的onDraw方法已经执行了,只是你没有看到预期的效果,认为它没有运行
mlayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
原来忘了这句
显示控件用windowmanager做,控件的交互在控件内做交互事件添加,处理就好,还有notifycationmanager,但是不能随便移动
直接用构造函数,你操作的就不是一个对象了,你先new了个管理者a,下次你要new哥管理者b,你改b能修改a的属性么
小球要在服务里启动 不要在Activity里启动
也不要杀掉进程
有进行观看的就可以到我的课程里了。。右上角头像点进去后,左边第二个课程里就有了。
Android主线程本来就是基于事件驱动的,当你在一个界面没有双击,也没有单击,没有任何操作,界面没有变化,handler没有任何消息要抛出来,主线程就在一个while循环里阻塞着。主线程本来就是用来界面刷新,所以又叫UI如果你界面刷新都舍不得用它,那主线程还执行什么。如果你指的是,runnable里面,那几行简单的代码,那和UI测量重绘这些根本不是一个量级。更不需要考虑。
算基线的时候 , 如果不明白你可以全打印出来 ,查看具体数值,参照示意图
12参数为第一个点xy,34参数为第二个点xy,以此类推,path即为路径,其不会返回。每次都以自己为原点做偏移。
应该是在setDragState()这个方法里面没有调用invalidate()吧