首页 文章 精选 留言 我的

精选列表

搜索[android things],共10000篇文章
优秀的个人博客,低调大师

Android -- onAttachedToWindow()

onAttachedToWindow在Activity生命周期中的位置 放大招: onAttachedToWindow不能在onCreate中哟~ View view = getWindow().getDecorView(); WindowManager.LayoutParams lp = (WindowManager.LayoutParams)view.getLayoutParams(); lp.gravity = Gravity.CENTER; lp.width = (dm.widthPixels * 4) / 5; lp.height = (dm.widthPixels * 4) / 5; getWindowManager().updateViewLayout(view,lp); 放到onCreate中进行测试,结果在lp.gravity = Gravity.CENTER;这行报了空指针异常,所以view.getLayoutParams()获取的LayoutParams是空。 public final class ActivityThread { ...... final void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward) { ...... ActivityClientRecord r = performResumeActivity(token, clearHide); if (r != null) { final Activity a = r.activity; ...... // If the window hasn't yet been added to the window manager, // and this guy didn't finish itself or start another activity, // then go ahead and add the window. boolean willBeVisible = !a.mStartedActivity; if (!willBeVisible) { try { willBeVisible = ActivityManagerNative.getDefault().willActivityBeVisible( a.getActivityToken()); } catch (RemoteException e) { } } if (r.window == null && !a.mFinished && willBeVisible) { r.window = r.activity.getWindow(); View decor = r.window.getDecorView(); decor.setVisibility(View.INVISIBLE); ViewManager wm = a.getWindowManager(); WindowManager.LayoutParams l = r.window.getAttributes(); a.mDecor = decor; l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION; ...... if (a.mVisibleFromClient) { a.mWindowAdded = true; wm.addView(decor, l); } } ...... } ...... } ...... } 原来在ActivityThread执行handleResumeActivity时就会为PhoneWindow(r.activity.getWindow)中的DecorView设置LayoutParam,并且通过源码发现handleResumeActivity函数首先会执行performResumeActivity,此时会调用Activity的onResume()生命周期函数,这时问题就比较清晰了,看来只要在Activity的onResume生命周期后就能获取DecorView的LayoutParam,进而可以设置高度和宽度了。根据上面贴出的生命周期图,onResume()后面是onAttachedToWindow(),并且onAttachedToWindow只会调用一次,不会受用户操作行为影响。所以在onAttachedToWindow中进行窗口尺寸的修改再合适不过了。 干货 onAttachedToWindow运行在onResume之后; DecorView的LayoutParams是在ActivityThread的handleResumeActivity中设置的,并且该函数会调用Activity的onResume生命周期,所以在onResume之后可以设置窗体尺寸; 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4471984.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- isInEditMode

解释 Indicates whether this View is currently in edit mode. A View is usually in edit mode when displayed within a developer tool. For instance, if this View is being drawn by a visual user interface builder, this method should return true. Subclasses should check the return value of this method to provide different behaviors if their normal behavior might interfere with the host environment. For instance: the class spawns a thread in its constructor, the drawing code relies on device-specific features, etc. This method is usually checked in the drawing code of custom widgets. 如果在自定义控件的构造函数或者其他绘制相关地方使用系统依赖的代码,会导致可视化编辑器无法报错并提示:Use View.isInEditMode() in your custom views to skip code when shown inEclipse code public class LockRelativeLayout extends RelativeLayout { private Handler mainHandler = null; //与主Activity通信的Handler对象 public LockRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs, 0); mContext = context; if (isInEditMode()) { return; } mainHandler = ((MainActivity)mContext).getMHandler(); } } 如果不加上if (isInEditMode()) { return; },标红处代码会导致可视化编辑报错 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4456722.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- VelocityTracker

VelocityTracker 主要应用于touch event, VelocityTracker通过跟踪一连串事件实时计算出当前的速度。 方法 //获取一个VelocityTracker对象, 用完后记得回收 //回收后代表你不需要使用了,系统将此对象在此分配到其他请求者 static public VelocityTracker obtain(); public void recycle(); //计算当前速度, 其中units是单位表示, 1代表px/毫秒, 1000代表px/秒, .. //maxVelocity此次计算速度你想要的最大值 public void computeCurrentVelocity(int units, float maxVelocity); //经过一次computeCurrentVelocity后你就可以用一下几个方法获取此次计算的值 //id是touch event触摸点的ID, 来为多点触控标识,有这个标识在计算时可以忽略 //其他触点干扰,当然干扰肯定是有的 public float getXVelocity(); public float getYVelocity(); public float getXVelocity(int id); public float getYVelocity(int id); Code public class VelocityTrackerTest extends Activity { private TextView mInfo; private VelocityTracker mVelocityTracker; private int mMaxVelocity; private int mPointerId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mInfo = new TextView(this); mInfo.setLines(4); mInfo.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); mInfo.setTextColor(Color.WHITE); setContentView(mInfo); mMaxVelocity = ViewConfiguration.get(this).getMaximumFlingVelocity(); } @Override public boolean onTouchEvent(MotionEvent event) { if(null == mVelocityTracker) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(event); final VelocityTracker verTracker = mVelocityTracker; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //求第一个触点的id, 此时可能有多个触点,但至少一个 mPointerId = event.getPointerId(0); break; case MotionEvent.ACTION_MOVE: //求伪瞬时速度 verTracker.computeCurrentVelocity(1000, mMaxVelocity); float velocityX = verTracker.getXVelocity(mPointerId); float velocityY = verTracker.getYVelocity(mPointerId); recodeInfo(velocityX, velocityY); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if(null != mVelocityTracker) { mVelocityTracker.clear(); mVelocityTracker.recycle(); mVelocityTracker = null; } break; default: break; } return super.onTouchEvent(event); } private static final String sFormatStr = "velocityX=%f\nvelocityY=%f"; /** * 记录当前速度 * * @param velocityX x轴速度 * @param velocityY y轴速度 */ private void recodeInfo(final float velocityX, final float velocityY) { final String info = String.format(sFormatStr, velocityX, velocityY); mInfo.setText(info); } } 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4082579.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- DisplayMetrics

干货 DisplayMetrics dm = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(dm); screenWidth = dm.widthPixels; screenHeight = dm.heightPixels; density = dm.density; densityDpi = dm.densityDpi; scaledDensity = dm.scaledDensity; DisplayMetrics metrics = dm; Log.i("yydcdut", "metrics::density=" + metrics.density +", densityDpi="+metrics.densityDpi +", heightPixels="+metrics.heightPixels +", widthPixels="+metrics.widthPixels +", scaledDensity="+metrics.scaledDensity +", xdpi="+metrics.xdpi +", ydpi="+metrics.ydpi); Log打印出来: metrics::density=1.5, densityDpi=240, heightPixels=854, widthPixels=480, scaledDensity=1.5, xdpi=239.05882, ydpi=243.72585 metrics.widthPixels 屏幕宽 metrics.heightPixels 屏幕高 metrics.density 屏幕密度 构造函数 DisplayMetrics 不需要传递任何参数;调用 getWindowManager() 之后,会取得 现有 Activity 的 Handle ,此时,getDefaultDisplay() 方法将取得的宽高维度存放于 DisplayMetrics 对象中,而取得的宽高维度是以像素为单位(Pixel) ,“像素”所指的是“绝对像素” 而非“相对像素”。 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4254599.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- ActivityLifeCycleCallbacks

ActivityLifeCycleCallbacks Application通过此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理。 为什么用ActivityLifecycleCallbacks 以往若需监测Activity的生命周期事件代码,你可能是这样做的,重写每一个Acivity的onResume(),然后作统计和处理: @Override protected void onResume() { super.onResume(); //TODO 处理和统计代码 Log.v(TAG, "onResume"); Logger.v(TAG, "onResume"); Logging.v(TAG, "onResume"); //... } ActivityLifecycleCallbacks接口回调可以简化这一繁琐过程,在一个类中作统一处理。 ActivityLifecycleCallbacks怎么用? 在自定义的Application中的onCreate()方法,或在Application的无参构造方法内,调用Application.registerActivityLifecycleCallbacks()方法,并实现ActivityLifecycleCallbacks接口: public void onCreate() { super.onCreate(); this.registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { @Override public void onActivityStopped(Activity activity) { Logger.v(activity, "onActivityStopped"); } @Override public void onActivityStarted(Activity activity) { Logger.v(activity, "onActivityStarted"); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { Logger.v(activity, "onActivitySaveInstanceState"); } @Override public void onActivityResumed(Activity activity) { Logger.v(activity, "onActivityResumed"); } @Override public void onActivityPaused(Activity activity) { Logger.v(activity, "onActivityPaused"); } @Override public void onActivityDestroyed(Activity activity) { Logger.v(activity, "onActivityDestroyed"); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { Logger.v(activity, "onActivityCreated"); } }); }; Log: V/OneActivity: onActivityCreated V/OneActivity: onActivityStarted V/OneActivity: onActivityResumed V/OneActivity: onActivityPaused V/MainActivity: onActivityCreated V/MainActivity: onActivityStarted V/MainActivity: onActivityResumed V/OneActivity: onActivityStopped V/OneActivity: onActivityDestroyed V/MainActivity: onActivityPaused V/MainActivity: onActivityStopped V/MainActivity: onActivityDestroyed 注意 ActivityLifeCycleCallbacks在API>=14上才可以调用。 兼容API<14 自己写一个ActivityLifeCycleCallbacks接口: public interface ActivityLifecycleCallbacks{ public void onActivityStopped(Activity activity); public void onActivityStarted(Activity activity); public void onActivitySaveInstanceState(Activity activity, Bundle outState); public void onActivityResumed(Activity activity); public void onActivityPaused(Activity activity); public void onActivityDestroyed(Activity activity); public void onActivityCreated(Activity activity, Bundle savedInstanceState); } 在Application中实现接口: public class MyApplication extends Application implements my.package.ActivityLifecycleCallbacks{ @Override public void onCreate() { super.onCreate(); } @Override public void onActivityStopped(Activity activity) { Log.i("Tracking Activity Stopped", activity.getLocalClassName()); } @Override public void onActivityStarted(Activity activity) { Log.i("Tracking Activity Started", activity.getLocalClassName()); } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { Log.i("Tracking Activity SaveInstanceState", activity.getLocalClassName()); } @Override public void onActivityResumed(Activity activity) { Log.i("Tracking Activity Resumed", activity.getLocalClassName()); } @Override public void onActivityPaused(Activity activity) { Log.i("Tracking Activity Paused", activity.getLocalClassName()); } @Override public void onActivityDestroyed(Activity activity) { Log.i("Tracking Activity Destroyed", activity.getLocalClassName()); } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { Log.i("Tracking Activity Created", activity.getLocalClassName()); } } 写基类: public class BaseActivity extends Activity { protected MyApplication nMyApplication; protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); nMyApplication = (MyApplication) getApplication(); nMyApplication.onActivityCreated(this, savedInstanceState); } protected void onResume() { // TODO Auto-generated method stub nMyApplication.onActivityResumed(this); super.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub nMyApplication.onActivityPaused(this); super.onPause(); } @Override protected void onDestroy() { // TODO Auto-generated method stub nMyApplication.onActivityDestroyed(this); super.onDestroy(); } @Override protected void onStart() { nMyApplication.onActivityStarted(this); super.onStart(); } @Override protected void onStop() { nMyApplication.onActivityStopped(this); super.onStop(); } @Override protected void onSaveInstanceState(Bundle outState) { nMyApplication.onActivitySaveInstanceState(this, outState); super.onSaveInstanceState(outState); } } 所有的类集成这个基类: public class MainActivity extends BaseActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4945990.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android -- setWillNotDraw()

干货 处理onDraw()方法不被执行的解决方法: setWillNotDraw(false); 官方文档的解释: If this view doesn't do any drawing on its own, set this flag to allow further optimizations. By default, this flag is not set on View, but could be set on some View subclasses such as ViewGroup. Typically, if you overrideonDraw(Canvas)you should clear this flag. 用法 public class LayoutLayout extends LinearLayout { public LayoutLayout (Context context, intposition) { super(context); setWillNotDraw(false); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); } } } 总结 设置view是否更改,如果用自定义的view,重写ondraw()应该将调用此方法设置为false,这样程序会调用自定义的布局。 我是天王盖地虎的分割线 本文转自我爱物联网博客园博客,原文链接:http://www.cnblogs.com/yydcdut/p/4190008.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册