自定义控件(视图)2期笔记13:View的滑动冲突之 内部拦截法

1. 内部拦截法:

父容器不拦截事件,所有的事件全部都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交给父容器进行处理。

这种方法和Android中的事件分发机制不一样,需要配合requestDisallowInterceptTouchEvent方法才能正常工作,使用起来较外部拦截法稍显负责一点。

我们需要重写子元素的dispatchTouchEvent方法

这种方法的伪代码是:

 1  @Override
 2     public boolean dispatchTouchEvent(MotionEvent event) {
 3         int x = (int) event.getX();
 4         int y = (int) event.getY();
 5 
 6         switch (event.getAction()) {
 7         case MotionEvent.ACTION_DOWN: {
 8             parent.requestDisallowInterceptTouchEvent(true);
 9             break;
10         }
11         case MotionEvent.ACTION_MOVE: {
12             int deltaX = x - mLastX;
13             int deltaY = y - mLastY;
14             if (父容器需要此类点击事件) {
15                 parent.requestDisallowInterceptTouchEvent(false);
16             }
17             break;
18         }
19         case MotionEvent.ACTION_UP: {
20             break;
21         }
22         default:
23             break;
24         }
25 
26         mLastX = x;
27         mLastY = y;
28         return super.dispatchTouchEvent(event);
29     }

上面重写的子元素的dispatchTouchEvent方法,这里同时需要重写父容器的onInterceptTouchEvent方法,为什么呢?

那是因为ACTION_DOWN事件并不受FLAG_DISALLOW_INTERCEPT这个标记位的控制,所以一旦父容器拦截ACTION_DOWN事件,那么所有的事件都无法传递到子元素之中,这样内部拦截法就无法起作用了。

父容器所做的修改如下:

 1 @Override
 2     public boolean onInterceptTouchEvent(MotionEvent event) {
 3 
 4         int action = event.getAction();
 5         if (action == MotionEvent.ACTION_DOWN) {
 6             return false;
 7         } else {
 8             return true;
 9         }
10     }

 

2. 下面通过一个Demo示例说明:

(1)首先我们创建一个Android工程,如下:

 

(2)首先我们来到主布局activity_main.xml,如下:

 1 <com.himi.viewconflict1.ui.RevealLayout
 2     xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical"
 7     android:padding="12dp"
 8     tools:context="${relativePackage}.${activityClass}" >
 9 
10     <Button
11         android:id="@+id/button1"
12         style="@style/AppTheme.Button.Green"
13         android:onClick="onButtonClick"
14         android:text="滑动冲突场景1-内部拦截" />
15 
16 </com.himi.viewconflict1.ui.RevealLayout>

(3)接下来来到MainActivity,如下:

 1 package com.himi.viewconflict;
 2 
 3 import android.app.Activity;
 4 import android.content.Intent;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 
 8 public class MainActivity extends Activity {
 9 
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main);
14     }
15 
16     
17     
18     public void onButtonClick(View view) {
19          Intent intent = new Intent(this, DemoActivity_1.class);
20          startActivity(intent);
21     }
22 }

 

(4)上面很自然地跳转到DemoActivity_2之中,如下:

 1 package com.himi.viewconflict1;
 2 
 3 import java.util.ArrayList;
 4 
 5 import com.himi.viewconflict1.ui.HorizontalScrollViewEx2;
 6 import com.himi.viewconflict1.ui.ListViewEx;
 7 import com.himi.viewconflict1.utils.MyUtils;
 8 
 9 import android.app.Activity;
10 import android.graphics.Color;
11 import android.os.Bundle;
12 import android.util.Log;
13 import android.view.LayoutInflater;
14 import android.view.MotionEvent;
15 import android.view.View;
16 import android.view.ViewGroup;
17 import android.widget.AdapterView;
18 import android.widget.AdapterView.OnItemClickListener;
19 import android.widget.ArrayAdapter;
20 import android.widget.TextView;
21 import android.widget.Toast;
22 
23 public class DemoActivity_2 extends Activity {
24     private static final String TAG = "DemoActivity_2";
25 
26     private HorizontalScrollViewEx2 mListContainer;
27 
28     @Override
29     protected void onCreate(Bundle savedInstanceState) {
30         super.onCreate(savedInstanceState);
31         setContentView(R.layout.demo_2);
32         Log.d(TAG, "onCreate");
33         initView();
34     }
35 
36     private void initView() {
37         LayoutInflater inflater = getLayoutInflater();
38         mListContainer = (HorizontalScrollViewEx2) findViewById(R.id.container);
39         final int screenWidth = MyUtils.getScreenMetrics(this).widthPixels;
40         final int screenHeight = MyUtils.getScreenMetrics(this).heightPixels;
41         for (int i = 0; i < 3; i++) {
42             ViewGroup layout = (ViewGroup) inflater.inflate(
43                     R.layout.content_layout2, mListContainer, false);
44             layout.getLayoutParams().width = screenWidth;
45             TextView textView = (TextView) layout.findViewById(R.id.title);
46             textView.setText("page " + (i + 1));
47             layout.setBackgroundColor(Color
48                     .rgb(255 / (i + 1), 255 / (i + 1), 0));
49             createList(layout);
50             mListContainer.addView(layout);
51         }
52     }
53 
54     private void createList(ViewGroup layout) {
55         ListViewEx listView = (ListViewEx) layout.findViewById(R.id.list);
56         ArrayList<String> datas = new ArrayList<String>();
57         for (int i = 0; i < 50; i++) {
58             datas.add("name " + i);
59         }
60         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
61                 R.layout.content_list_item, R.id.name, datas);
62         listView.setAdapter(adapter);
63         listView.setHorizontalScrollViewEx2(mListContainer);
64         listView.setOnItemClickListener(new OnItemClickListener() {
65             @Override
66             public void onItemClick(AdapterView<?> parent, View view,
67                     int position, long id) {
68                 Toast.makeText(DemoActivity_2.this, "click item "+position,
69                         Toast.LENGTH_SHORT).show();
70 
71             }
72         });
73     }
74 
75     @Override
76     public boolean dispatchTouchEvent(MotionEvent ev) {
77         Log.d(TAG, "dispatchTouchEvent action:" + ev.getAction());
78         return super.dispatchTouchEvent(ev);
79     }
80     
81     @Override
82     public boolean onTouchEvent(MotionEvent event) {
83         Log.d(TAG, "onTouchEvent action:" + event.getAction());
84         return super.onTouchEvent(event);
85     }
86 }

上面的DemoActivity_2主布局demo_2.xml,如下:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:background="#ffffff"
 6     android:orientation="vertical" >
 7 
 8     <com.himi.viewconflict1.ui.HorizontalScrollViewEx2
 9         android:id="@+id/container"
10         android:layout_width="wrap_content"
11         android:layout_height="match_parent" />
12 
13 
14 </LinearLayout>

上面使用到HorizontalScrollViewEx2是自定义控件(继承自ViewGroup),如下:

HorizontalScrollViewEx2是父容器,这里需要重写它的onInterceptTouchEvent方法,让父容器不拦截ACTION_DOWN事件。

  1 package com.himi.viewconflict1.ui;
  2 
  3 import android.content.Context;
  4 import android.util.AttributeSet;
  5 import android.util.Log;
  6 import android.view.MotionEvent;
  7 import android.view.VelocityTracker;
  8 import android.view.View;
  9 import android.view.ViewGroup;
 10 import android.widget.Scroller;
 11 
 12 public class HorizontalScrollViewEx2 extends ViewGroup {
 13     private static final String TAG = "HorizontalScrollViewEx2";
 14 
 15     private int mChildrenSize;
 16     private int mChildWidth;
 17     private int mChildIndex;
 18     // 分别记录上次滑动的坐标
 19     private int mLastX = 0;
 20     private int mLastY = 0;
 21 
 22     // 分别记录上次滑动的坐标(onInterceptTouchEvent)
 23     private int mLastXIntercept = 0;
 24     private int mLastYIntercept = 0;
 25 
 26     private Scroller mScroller;
 27     private VelocityTracker mVelocityTracker;
 28 
 29     public HorizontalScrollViewEx2(Context context) {
 30         super(context);
 31         init();
 32     }
 33 
 34     public HorizontalScrollViewEx2(Context context, AttributeSet attrs) {
 35         super(context, attrs);
 36         init();
 37     }
 38 
 39     public HorizontalScrollViewEx2(Context context, AttributeSet attrs,
 40             int defStyle) {
 41         super(context, attrs, defStyle);
 42         init();
 43     }
 44 
 45     private void init() {
 46         mScroller = new Scroller(getContext());
 47         mVelocityTracker = VelocityTracker.obtain();
 48     }
 49 
 50     @Override
 51     public boolean onInterceptTouchEvent(MotionEvent event) {
 52         int x = (int) event.getX();
 53         int y = (int) event.getY();
 54         int action = event.getAction();
 55         if (action == MotionEvent.ACTION_DOWN) {
 56             mLastX = x;
 57             mLastY = y;
 58             if (!mScroller.isFinished()) {
 59                 mScroller.abortAnimation();
 60                 return true;
 61             }
 62             return false;
 63         } else {
 64             return true;
 65         }
 66     }
 67 
 68     @Override
 69     public boolean onTouchEvent(MotionEvent event) {
 70         Log.d(TAG, "onTouchEvent action:" + event.getAction());
 71         mVelocityTracker.addMovement(event);
 72         int x = (int) event.getX();
 73         int y = (int) event.getY();
 74         switch (event.getAction()) {
 75         case MotionEvent.ACTION_DOWN: {
 76             if (!mScroller.isFinished()) {
 77                 mScroller.abortAnimation();
 78             }
 79             break;
 80         }
 81         case MotionEvent.ACTION_MOVE: {
 82             int deltaX = x - mLastX;
 83             int deltaY = y - mLastY;
 84             Log.d(TAG, "move, deltaX:" + deltaX + " deltaY:" + deltaY);
 85             scrollBy(-deltaX, 0);
 86             break;
 87         }
 88         case MotionEvent.ACTION_UP: {
 89             int scrollX = getScrollX();
 90             int scrollToChildIndex = scrollX / mChildWidth;
 91             Log.d(TAG, "current index:" + scrollToChildIndex);
 92             mVelocityTracker.computeCurrentVelocity(1000);
 93             float xVelocity = mVelocityTracker.getXVelocity();
 94             if (Math.abs(xVelocity) >= 50) {
 95                 mChildIndex = xVelocity > 0 ? mChildIndex - 1 : mChildIndex + 1;
 96             } else {
 97                 mChildIndex = (scrollX + mChildWidth / 2) / mChildWidth;
 98             }
 99             mChildIndex = Math.max(0, Math.min(mChildIndex, mChildrenSize - 1));
100             int dx = mChildIndex * mChildWidth - scrollX;
101             smoothScrollBy(dx, 0);
102             mVelocityTracker.clear();
103             Log.d(TAG, "index:" + scrollToChildIndex + " dx:" + dx);
104             break;
105         }
106         default:
107             break;
108         }
109 
110         mLastX = x;
111         mLastY = y;
112         return true;
113     }
114 
115     @Override
116     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
117         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
118         int measuredWidth = 0;
119         int measuredHeight = 0;
120         final int childCount = getChildCount();
121         measureChildren(widthMeasureSpec, heightMeasureSpec);
122 
123         int widthSpaceSize = MeasureSpec.getSize(widthMeasureSpec);
124         int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
125         int heightSpaceSize = MeasureSpec.getSize(heightMeasureSpec);
126         int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
127         if (childCount == 0) {
128             setMeasuredDimension(0, 0);
129         } else if (heightSpecMode == MeasureSpec.AT_MOST) {
130             final View childView = getChildAt(0);
131             measuredHeight = childView.getMeasuredHeight();
132             setMeasuredDimension(widthSpaceSize, childView.getMeasuredHeight());
133         } else if (widthSpecMode == MeasureSpec.AT_MOST) {
134             final View childView = getChildAt(0);
135             measuredWidth = childView.getMeasuredWidth() * childCount;
136             setMeasuredDimension(measuredWidth, heightSpaceSize);
137         } else {
138             final View childView = getChildAt(0);
139             measuredWidth = childView.getMeasuredWidth() * childCount;
140             measuredHeight = childView.getMeasuredHeight();
141             setMeasuredDimension(measuredWidth, measuredHeight);
142         }
143     }
144 
145     @Override
146     protected void onLayout(boolean changed, int l, int t, int r, int b) {
147         Log.d(TAG, "width:" + getWidth());
148         int childLeft = 0;
149         final int childCount = getChildCount();
150         mChildrenSize = childCount;
151 
152         for (int i = 0; i < childCount; i++) {
153             final View childView = getChildAt(i);
154             if (childView.getVisibility() != View.GONE) {
155                 final int childWidth = childView.getMeasuredWidth();
156                 mChildWidth = childWidth;
157                 childView.layout(childLeft, 0, childLeft + childWidth,
158                         childView.getMeasuredHeight());
159                 childLeft += childWidth;
160             }
161         }
162     }
163 
164     private void smoothScrollBy(int dx, int dy) {
165         mScroller.startScroll(getScrollX(), 0, dx, 0, 500);
166         invalidate();
167     }
168 
169     @Override
170     public void computeScroll() {
171         if (mScroller.computeScrollOffset()) {
172             scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
173             postInvalidate();
174         }
175     }
176 
177     @Override
178     protected void onDetachedFromWindow() {
179         mVelocityTracker.recycle();
180         super.onDetachedFromWindow();
181     }
182 }

 

(5)来到主布局之中,在HorizontalScrollViewEx2之中包含一个子布局content_layout2.xml,如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <TextView
 8         android:id="@+id/title"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:layout_marginTop="5dp"
12         android:layout_marginBottom="5dp"
13         android:text="TextView" />
14 
15     <com.himi.viewconflict1.ui.ListViewEx
16         android:id="@+id/list"
17         android:layout_width="match_parent"
18         android:layout_height="match_parent"
19         android:background="#fff4f7f9"
20         android:cacheColorHint="#00000000"
21         android:divider="#dddbdb"
22         android:dividerHeight="1.0px"
23         android:listSelector="@android:color/transparent" />
24 
25 </LinearLayout>

上面的ListViewEx是自定义的控件(继承自ListView),在ListViewEx里面实现了内部拦截法的逻辑,如下:

 1 package com.himi.viewconflict1.ui;
 2 
 3 import android.content.Context;
 4 import android.util.AttributeSet;
 5 import android.util.Log;
 6 import android.view.MotionEvent;
 7 import android.widget.ListView;
 8 
 9 public class ListViewEx extends ListView {
10     private static final String TAG = "ListViewEx";
11 
12     private HorizontalScrollViewEx2 mHorizontalScrollViewEx2;
13 
14     // 分别记录上次滑动的坐标
15     private int mLastX = 0;
16     private int mLastY = 0;
17 
18     public ListViewEx(Context context) {
19         super(context);
20     }
21 
22     public ListViewEx(Context context, AttributeSet attrs) {
23         super(context, attrs);
24     }
25 
26     public ListViewEx(Context context, AttributeSet attrs, int defStyle) {
27         super(context, attrs, defStyle);
28     }
29 
30     public void setHorizontalScrollViewEx2(
31             HorizontalScrollViewEx2 horizontalScrollViewEx2) {
32         mHorizontalScrollViewEx2 = horizontalScrollViewEx2;
33     }
34 
35     @Override
36     public boolean dispatchTouchEvent(MotionEvent event) {
37         int x = (int) event.getX();
38         int y = (int) event.getY();
39 
40         switch (event.getAction()) {
41         case MotionEvent.ACTION_DOWN: {
42             mHorizontalScrollViewEx2.requestDisallowInterceptTouchEvent(true);
43             break;
44         }
45         case MotionEvent.ACTION_MOVE: {
46             int deltaX = x - mLastX;
47             int deltaY = y - mLastY;
48             Log.d(TAG, "dx:" + deltaX + " dy:" + deltaY);
49             if (Math.abs(deltaX) > Math.abs(deltaY)) {
50                 mHorizontalScrollViewEx2.requestDisallowInterceptTouchEvent(false);
51             }
52             break;
53         }
54         case MotionEvent.ACTION_UP: {
55             break;
56         }
57         default:
58             break;
59         }
60 
61         mLastX = x;
62         mLastY = y;
63         return super.dispatchTouchEvent(event);
64     }
65 
66 }

 void  requestDisallowInterceptTouchEvent(boolean  disallowIntercept):

这个方法的入参一个boolean 变量,用来表示是否需要调用onInterceptTouchEvent来判断是否拦截.

该标记如果为True,就如它的字面意思一样---不允许调用onInterceptTouchEvent(),结果就是,所有的父类方法都不会进行拦截,而把事件传递给子View. 该方法属于ViewGroup ,并且是个递归方法,也就是说一旦调用后,所有父类的disallowIntercept都会设置成True。即当前View的所有父类View,都不会调用自身的onInterceptTouchEvent()进行拦截。

该标记如果为False,就如它的字面意思一样---允许调用onInterceptTouchEvent(),结果就是,父类可以拦截事件。

 

接下来,来到Listview的Item布局content_list_item.xml,如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="50dp"
 5     android:gravity="center_vertical"
 6     android:orientation="vertical" >
 7 
 8     <TextView
 9         android:id="@+id/name"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:text="TextView" />
13 
14 </LinearLayout>

(6)最终项目如下:

 

(7)部署程序到手机上,如下:

 

 

3. 示例源码下载

 

转载于:https://www.cnblogs.com/hebao0514/p/5700730.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序图片加载太慢;uni-app微信小程序加载图片优化;微信小程序图片image加载成功事件@load;图片加载成功触发@load事件

场景&#xff1a; 微信小程序&#xff0c;对于以下较大的图片&#xff08;例如几M&#xff09;&#xff0c;在真机运行时候加载比较慢&#xff0c;此时会有一个比较长时间的白屏&#xff0c;体验很差。 解决方案&#xff1a;图片未加载成功前&#xff0c;进行loading…;图片加载…

循环队列及C语言实现一

循环队列是为了充分利用内存&#xff0c;进行数据操作的一种基本算法。具体实现方式可划分为&#xff1a;链式队列和静态队列&#xff0c;这里所谓的静态是指在一片连续的内存区域进行数据操作。本文只讲述静态队列&#xff0c;也是最简单的实现方式&#xff0c;链式队列以及链…

微信小程序自定义导航栏;uni-app微信小程序自定义顶部导航栏;微信小程序顶部导航栏高度;微信小程序左上角胶囊按钮;uni-app微信小程序左上角胶囊设置

本文是自定义微信小程序的顶部导航栏&#xff1b;自定义微信小程序底部导航栏tabBar看另外这篇 文末的两个文件代码可以直接复制使用 自定义导航栏页图 一、场景&#xff1a; 有些时候&#xff0c;微信小程序需要我们在导航栏做更多的操作样式&#xff08;例如高度、颜色、加…

HTML5与HTML4的比较

HHTML5封装一些标签和属性&#xff0c;方便了开发。 1 <form> 2 <p> 3 <label>Username:<input name"search" type"text" id"search" autofocus></label> 4 </p> 5 &l…

[iOS]Unable to run app in Simulator

From: http://blog.csdn.net/snowwind/article/details/41099575 今天在试Admob的时候&#xff0c;发现在simulator上&#xff0c;程序突然不能运行了&#xff0c; 提示 [plain] view plaincopy Unable to run app in Simulator An error was encountered while running (…

uni-app微信小程序动态样式设置;微信小程序style行内式无效;微信小程序style行内式编译报错;微信小程序:style设置样式

场景&#xff1a;微信小程序设置动态样式&#xff0c;有些时候是需要用到变量来书写的&#xff1b;但是实际使用发现&#xff0c;行内式书写虽然有效&#xff0c;但是会使得微信小程序的编辑失败&#xff1b;故需要使用动态的v-bind来写动态变量行内式样式&#xff08;既使用:s…

循环队列及C语言实现二

在我的上一篇博文中已经讲到循环队列的特点作用以及C语言实现&#xff0c;当然实现和操作的方式比较简单&#xff0c;在实际项目应用中略显粗糙。因此&#xff0c;这一篇提供一个进阶篇的实现与操作接口。具体函数作用可以参见我的注释部分&#xff0c;使用的时候直接把里面的接…

MAC下secureCRT无法保存密码的解决方法

From: http://www.php230.com/securecrt-for-mac-store-password.html 在mac下新安装了secureCRT&#xff0c;取代系统自带的终端工具&#xff0c;主要是为了方便链接服务器。 mac下面的secureCRT默认保存不上密码&#xff0c;我们选择了保存密码后&#xff0c;下次登录还是提…

微信小程序下拉刷新列表onPullDownRefresh;微信小程序上划加载列表onReachBottom;uni-app微信小程序下拉加载数据;uni-app微信小程序上划页面加载数据

需求&#xff1a;微信小程序列表加载有两种方式&#xff0c;分别是按住页面下拉加载数据数据&#xff08;触发onPullDownRefresh&#xff09;和直接上划滚动页面到底部加载数据&#xff08;触发onReachBottom函数&#xff09;。 本文主要是使用上划滚动页面触底加载数据&#x…

ARP协议在同网段及跨网段下的工作原理

一、ARP在同个网段下的工作原理 首先&#xff0c;每台主机都会在自己的ARP缓冲区中建立一个 ARP列表&#xff0c;以表示IP地址和MAC地址的对应关系。当源主机需要将一个数据包要发送到目的主机时&#xff0c;会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址&#xff0…

如何查看服务器当前的负载信息

From: http://blog.csdn.net/mal327/article/details/7423750 如何查看服务器当前的负载信息http://www.flybaaa.com/help/69_1.html网吧内突然很卡&#xff0c;这个情况我相信大家都有遇见过&#xff0c;但是通过什么方法来排查是否linux服务器的负载过大导致的这个问题呢&am…

Realtek网卡如何识别具体型号是8111B/8111C/8111D还是8111E???

From: http://support.icafe8.com/technologynews/focus/1347.html 貌似在去年&#xff0c;Realtek网卡把型号都统一为Realtek GBE什么什么的这种名字&#xff0c;这个修改说实话&#xff0c;对有盘没啥影响&#xff0c;只要驱动装好&#xff0c;能上网就ok了&#xff0c;但是…

【leetcode77】Single Number

一题目描述&#xff1a; 给定一个数组&#xff0c;只有一个数字出现一次&#xff0c;其余都是两次&#xff0c;判断那个数字 思路&#xff1a; 不断取出数据进行异或&#xff0c;最后一个数字&#xff0c;因为相同的数字会抵消代码&#xff1a; public class Solution {public …

Remoting-1

什么是Remoting&#xff0c;简而言之&#xff0c;我们可以将其看作是一种分布式处理方式。从微软的产品角度来看&#xff0c;可以说Remoting就是DCOM的一种升级&#xff0c;它改善了很多功能&#xff0c;并极好的融合到.Net平台下。Microsoft .NET Remoting 提供了一种允许对象…

DEBUG 调试

1.Step Into (also F5) 跳入 2.Step Over (also F6) 跳过 3.Step Return (also F7) 执行完当前method&#xff0c;然后return跳出此method 4.step Filter 逐步过滤 一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering) 5.resume 重…

promise使用详解

原文链接以及promise练习题 先说结论&#xff1a; promise是解决异步函数的一种方案 将异步操作以同步方式展现出来 避免了回调地狱 1.三种状态&#xff1a;padding–等待 resolved–成功–then rejected–失败–catch 2.promise上有then和catch方法 then接受一个参数是函数 这…

Android 对话框(Dialog)大全 建立你自己的对话框

Activities提供了一种方便管理的创建、保存、回复的对话框机制&#xff0c;例如 onCreateDialog(int), onPrepareDialog(int, Dialog), showDialog(int), dismissDialog(int)等方法&#xff0c;如果使用这些方法的话&#xff0c;Activity将通过getOwnerActivity()方法返回该Act…

HDU 5795

题意&#xff1a; 两人轮流从 n 堆 糖果里取糖果&#xff0c;每次可以1&#xff09; 选择一堆取任意个&#xff08;不为 0&#xff09;2) 选择一堆糖果分成 3 堆&#xff08;每堆数量 > 1)拿到最后一颗糖果的人赢。 解题 &#xff1a; 打表算出一些 sg 值&#xff0c;就可以…

mac下beyond compare配置图

配置Tab键为4个空格&#xff1a; 显示行号&#xff1a;