`
Arthur_Wen
  • 浏览: 30545 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

onInterceptTouchEvent和onTouchEvent调用时序

阅读更多
http://blog.csdn.net/ddna/archive/2010/04/11/5473293.aspx
onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个childView触发onTouchEvent()之前对相关事件进行一次拦截,Android这么设计的想法也很好理解,由于ViewGroup会包含若干childView,因此需要能够统一监控各种touch事件的机会,因此纯粹的不能包含子view的控件是没有这个方法的,如LinearLayout就有,TextView就没有。

onInterceptTouchEvent()使用也很简单,如果在ViewGroup里覆写了该方法,那么就可以对各种touch事件加以拦截。但是如何拦截,是否所有的touch事件都需要拦截则是比较复杂的,touch事件在onInterceptTouchEvent()和onTouchEvent以及各个childView间的传递机制完全取决于onInterceptTouchEvent()和onTouchEvent()的返回值。并且,针对down事件处理的返回值直接影响到后续move和up事件的接收和传递。 

关于返回值的问题,基本规则很清楚,如果return true,那么表示该方法消费了此次事件,如果return false,那么表示该方法并未处理完全,该事件仍然需要以某种方式传递下去继续等待处理。

SDK给出的说明如下:

·  You will receive the down event here.

·  The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle; this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture (instead of looking for a parent view to handle it). Also, by returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing must happen in onTouchEvent() like normal.

·  For as long as you return false from this function, each following event (up to and including the final up) will be delivered first here and then to the target's onTouchEvent().

·  If you return true from here, you will not receive any following events: the target view will receive the same event but with the action ACTION_CANCEL, and all further events will be delivered to your onTouchEvent() method and no longer appear here.



由于onInterceptTouchEvent()的机制比较复杂,上面的说明写的也比较复杂,总结一下,基本的规则是:

1.       down事件首先会传递到onInterceptTouchEvent()方法

2.       如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。

3.       如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view将接收不到任何事件。

4.       如果最终需要处理事件的view的onTouchEvent()返回了false,那么该事件将被传递至其上一层次的view的onTouchEvent()处理。

5.       如果最终需要处理事件的view 的onTouchEvent()返回了true,那么后续事件将可以继续传递给该view的onTouchEvent()处理。



下面用一个简单的实验说明上述复杂的规则。视图自底向上共3层,其中LayoutView1和LayoutView2就是LinearLayout, MyTextView就是TextView:

对应的xml布局文件如下:
<?xml version="1.0" encoding="utf-8"?>

<com.touchstudy.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent" >

    <com.touchstudy.LayoutView2

        android:orientation="vertical"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:gravity="center">

       <com.touchstudy.MyTextView  

            android:layout_width="wrap_content" 

            android:layout_height="wrap_content" 

            android:id="@+id/tv"

            android:text="AB"

            android:textSize="40sp"

            android:textStyle="bold"

            android:background="#FFFFFF"

            android:textColor="#0000FF"/>

   </com.touchstudy.LayoutView2>

</com.touchstudy.LayoutView1>

下面看具体情况:

1.       onInterceptTouchEvent()处理down事件均返回false,onTouchEvent()处理事件均返回true

------------------------------------------------------------------------------------------------------------------------------

04-11 03:58:42.620: DEBUG/LayoutView1(614): onInterceptTouchEvent action:ACTION_DOWN

04-11 03:58:42.620: DEBUG/LayoutView2(614): onInterceptTouchEvent action:ACTION_DOWN

04-11 03:58:42.620: DEBUG/MyTextView(614): onTouchEvent action:ACTION_DOWN

04-11 03:58:42.800: DEBUG/LayoutView1(614): onInterceptTouchEvent action:ACTION_MOVE

04-11 03:58:42.800: DEBUG/LayoutView2(614): onInterceptTouchEvent action:ACTION_MOVE

04-11 03:58:42.800: DEBUG/MyTextView(614): onTouchEvent action:ACTION_MOVE

…… //省略过多的ACTION_MOVE

04-11 03:58:43.130: DEBUG/LayoutView1(614): onInterceptTouchEvent action:ACTION_UP

04-11 03:58:43.130: DEBUG/LayoutView2(614): onInterceptTouchEvent action:ACTION_UP

04-11 03:58:43.150: DEBUG/MyTextView(614): onTouchEvent action:ACTION_UP

------------------------------------------------------------------------------------------------------------------------------

这是最常见的情况,onInterceptTouchEvent并没有做任何改变事件传递时序的操作,效果上和没有覆写该方法是一样的。可以看到,各种事件的传递本身是自底向上的,次序是:LayoutView1->LayoutView2->MyTextView。注意,在onInterceptTouchEvent均返回false时,LayoutView1和LayoutView2的onTouchEvent并不会收到事件,而是最终传递给了MyTextView。



2.     LayoutView1的onInterceptTouchEvent()处理down事件返回true,
MyTextView的onTouchEvent()处理事件返回true

------------------------------------------------------------------------------------------------------------------------------
04-11 03:09:27.589: DEBUG/LayoutView1(446): onInterceptTouchEvent action:ACTION_DOWN

04-11 03:09:27.589: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_DOWN

04-11 03:09:27.629: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_MOVE

04-11 03:09:27.689: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_MOVE

…… //省略过多的ACTION_MOVE

04-11 03:09:27.959: DEBUG/LayoutView1(446): onTouchEvent action:ACTION_UP

------------------------------------------------------------------------------------------------------------------------------

从Log可以看到,由于LayoutView1在拦截第一次down事件时return true,所以后续的事件(包括第一次的down)将由LayoutView1本身处理,事件不再传递下去。



3.       LayoutView1,LayoutView2的onInterceptTouchEvent()处理down事件返回false,

MyTextView的onTouchEvent()处理事件返回false

LayoutView2的onTouchEvent()处理事件返回true

----------------------------------------------------------------------------------------------------------------------------

04-11 09:50:21.147: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_DOWN

04-11 09:50:21.147: DEBUG/LayoutView2(301): onInterceptTouchEvent action:ACTION_DOWN

04-11 09:50:21.147: DEBUG/MyTextView(301): onTouchEvent action:ACTION_DOWN

04-11 09:50:21.147: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_DOWN

04-11 09:50:21.176: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_MOVE

04-11 09:50:21.176: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_MOVE

04-11 09:50:21.206: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_MOVE

04-11 09:50:21.217: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_MOVE

…… //省略过多的ACTION_MOVE

04-11 09:50:21.486: DEBUG/LayoutView1(301): onInterceptTouchEvent action:ACTION_UP

04-11 09:50:21.486: DEBUG/LayoutView2(301): onTouchEvent action:ACTION_UP

----------------------------------------------------------------------------------------------------------------------------

可以看到,由于MyTextView在onTouchEvent()中return false,down事件被传递给其父view,即LayoutView2的onTouchEvent()方法处理,由于在LayoutView2的onTouchEvent()中return true,所以down事件传递并没有上传到LayoutView1。注意,后续的move和up事件均被传递给LayoutView2的onTouchEvent()处理,而没有传递给MyTextView。



----------------------------------------------------------------------------------------------------------------

应大家的要求,我把源代码贴上,其实很简单,就是基础文件,主要是用来观察事件的传递。
主Activity: InterceptTouchStudyActivity.java:

 

public class InterceptTouchStudyActivity extends Activity {

    static final String TAG = "ITSActivity";

    TextView tv;

    

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.layers_touch_pass_test);

     }


 }




      LayoutView1.java:




      public class LayoutView1 extends LinearLayout {

    	private final String TAG = "LayoutView1";

      	public LayoutView1(Context context, AttributeSet attrs) {


         super(context, attrs);

         Log.d(TAG,TAG);

     }

 

     @Override

     public boolean onInterceptTouchEvent(MotionEvent ev) {

         int action = ev.getAction();

         switch(action){

         case MotionEvent.ACTION_DOWN:

              Log.d(TAG,"onInterceptTouchEvent action:ACTION_DOWN");

//            return true;

              break;

         case MotionEvent.ACTION_MOVE:

              Log.d(TAG,"onInterceptTouchEvent action:ACTION_MOVE");

              break;

         case MotionEvent.ACTION_UP:

              Log.d(TAG,"onInterceptTouchEvent action:ACTION_UP");

              break;

         case MotionEvent.ACTION_CANCEL:

              Log.d(TAG,"onInterceptTouchEvent action:ACTION_CANCEL");

              break;

         }

         

         return false;

     }

 

     @Override

     public boolean onTouchEvent(MotionEvent ev) {

         int action = ev.getAction();

         switch(action){

         case MotionEvent.ACTION_DOWN:

              Log.d(TAG,"onTouchEvent action:ACTION_DOWN");

              break;

         case MotionEvent.ACTION_MOVE:

              Log.d(TAG,"onTouchEvent action:ACTION_MOVE");

              break;

         case MotionEvent.ACTION_UP:

              Log.d(TAG,"onTouchEvent action:ACTION_UP");

              break;

         case MotionEvent.ACTION_CANCEL:

              Log.d(TAG,"onTouchEvent action:ACTION_CANCEL");

              break;

         }

         

         return true;

     }

 

     @Override

     protected void onLayout(boolean changed, int l, int t, int r, int b) {

         // TODO Auto-generated method stub

         super.onLayout(changed, l, t, r, b);

     }

 

     @Override

     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

         // TODO Auto-generated method stub

         super.onMeasure(widthMeasureSpec, heightMeasureSpec);

     }

}




LayoutView2.java:

public class LayoutView2 extends LinearLayout {

    private final String TAG = "LayoutView2";

    

    public LayoutView2(Context context, AttributeSet attrs) {

       super(context, attrs);

       Log.d(TAG,TAG);

    }

 

    @Override

    public boolean onInterceptTouchEvent(MotionEvent ev) {

       int action = ev.getAction();

       switch(action){

       case MotionEvent.ACTION_DOWN:

           Log.d(TAG,"onInterceptTouchEvent action:ACTION_DOWN");

           break;

       case MotionEvent.ACTION_MOVE:

           Log.d(TAG,"onInterceptTouchEvent action:ACTION_MOVE");

           break;

       case MotionEvent.ACTION_UP:

           Log.d(TAG,"onInterceptTouchEvent action:ACTION_UP");

           break;

       case MotionEvent.ACTION_CANCEL:

           Log.d(TAG,"onInterceptTouchEvent action:ACTION_CANCEL");

           break;

       }

       

       return false;

    }

 

    @Override

    public boolean onTouchEvent(MotionEvent ev) {

       int action = ev.getAction();

       switch(action){

       case MotionEvent.ACTION_DOWN:

           Log.d(TAG,"onTouchEvent action:ACTION_DOWN");

           break;

       case MotionEvent.ACTION_MOVE:

           Log.d(TAG,"onTouchEvent action:ACTION_MOVE");

           break;

       case MotionEvent.ACTION_UP:

           Log.d(TAG,"onTouchEvent action:ACTION_UP");

           break;

       case MotionEvent.ACTION_CANCEL:

           Log.d(TAG,"onTouchEvent action:ACTION_CANCEL");

           break;

       }

       

       return true;

    } 

}




MyTextView.java:


public class MyTextView extends TextView {

    private final String TAG = "MyTextView";

    

    public MyTextView(Context context, AttributeSet attrs) {

       super(context, attrs);

       Log.d(TAG,TAG);

    }

 

    @Override

    public boolean onTouchEvent(MotionEvent ev) {

       int action = ev.getAction();

       switch(action){

       case MotionEvent.ACTION_DOWN:

           Log.d(TAG,"onTouchEvent action:ACTION_DOWN");

           break;

       case MotionEvent.ACTION_MOVE:

           Log.d(TAG,"onTouchEvent action:ACTION_MOVE");

           break;

       case MotionEvent.ACTION_UP:

           Log.d(TAG,"onTouchEvent action:ACTION_UP");

           break;

       case MotionEvent.ACTION_CANCEL:

           Log.d(TAG,"onTouchEvent action:ACTION_CANCEL");

           break;

       }

       

       return false;

    }

    

    public void onClick(View v) {

       Log.d(TAG, "onClick");

    }

    

    public boolean onLongClick(View v) {

       Log.d(TAG, "onLongClick");

       return false;

    }

}

分享到:
评论

相关推荐

    android事件2-onInterceptTouchEvent和onTouchEvent调用时序

    在Android开发中,理解和掌握`onInterceptTouchEvent`与`onTouchEvent`的调用时序至关重要,因为它们是实现触摸事件处理的关键。这两个方法都属于Android的触摸事件处理机制,涉及到了ViewGroup与子View之间的事件...

    Android中touch事件传递测试demo

    onInterceptTouchEvent和onTouchEvent调用时序详解 测试demo 详细介绍请移步:http://blog.csdn.net/yiranxinshou/article/details/9201833

    Touch事件案例

    "Touch事件案例"主要关注的是`onInterceptTouchEvent`和`onTouchEvent`这两个方法的调用时序,它们是处理触摸事件的关键组件,尤其在复杂的布局结构中,理解它们的工作原理对于优化用户界面和交互至关重要。...

    新化县建材家居协会电子商务频道共建专项方案.doc

    新化县建材家居协会电子商务频道共建专项方案.doc

    电动车控制器79HF9211:三相无刷电机矢量控制与智能驱动程序详解

    内容概要:本文详细介绍了79HF9211电动车控制器的程序架构及其关键实现细节。首先探讨了三相无刷电机的矢量控制,包括PWM频率设置、死区时间配置以及相电流采样的自校准。接着讨论了电机启动时采用的缓升策略,特别是线性斜坡函数的应用、初始力矩限制和霍尔传感器消抖处理。然后阐述了过流保护机制,强调了q轴电流监测和故障处理方法。最后提到了通信层的一些特殊功能,如CAN协议中的调试指令和安全冗余设计的重要性。 适合人群:从事电动车控制系统开发的技术人员,尤其是对三相无刷电机矢量控制感兴趣的工程师。 使用场景及目标:帮助开发者深入了解79HF9211控制器的工作原理和技术细节,掌握其编程技巧并应用于实际项目中,确保系统的高效性和稳定性。 其他说明:文中提供了多个代码片段作为实例,便于读者理解和实践。同时提醒使用者注意某些高级功能(如解除温度保护)可能带来的风险。

    PMSM FOC+SVPWM仿真模型与DSP28335代码实现及10kw永磁电机实验验证 · SVPWM 宝典

    内容概要:本文介绍了针对10千瓦永磁同步电机(PMSM)的FOC(磁场定向控制)+SVPWM(空间矢量脉宽调制)仿真模型及其在DSP28335芯片上的代码实现。首先阐述了实验背景与目的,旨在通过仿真模型深入了解PMSM的动态特性和有效控制策略。接着详细描述了基于MATLAB/Simulink平台构建的仿真模型,涵盖电机数学模型、控制算法及信号处理流程,重点在于矢量控制策略如电流环、速度环和磁场控制。随后展示了仿真的验证结果,表明模型能精确模拟电机运行状态并提升功率因数和效率。最后,文中详述了DSP28335代码实现部分,确保了电机控制算法的核心逻辑得以正确执行。实验验证显示,所提出的控制策略使电机运行稳定,响应迅速,满足预期性能指标。 适合人群:从事电机控制系统研究的技术人员、高校相关专业师生、对电机控制感兴趣的工程技术人员。 使用场景及目标:适用于需要理解和掌握PMSM FOC+SVPWM控制方法的研究人员和技术开发者,帮助他们更好地设计和优化电机控制系统,提高电机运行效率和控制精度。 其他说明:文章还提到未来将在此基础上进一步探索更多应用场景,优化现有模型与代码,以适应更广泛的实际需求。

    西门子PLC动态密码程序解析:适用于1200与1500PLC的SCL编写催款程序及动态密保

    内容概要:本文详细介绍了西门子PLC动态密码程序的设计与实现,特别针对1200PLC和1500PLC型号。该程序主要用于催款业务场景,采用了SCL(结构化控制语言)进行编写,提供了动态密保功能,增强了系统安全性和用户账户的保密性。文章从程序的编写思路、操作步骤到实际应用场景进行了全面解析,强调了其在提升工作效率、减少人为错误以及保障企业信息安全方面的优势。文中还提到,该程序具有高度的通用性和灵活性,适用于不同的业务需求,并配有详细的视频讲解,帮助用户更好地理解和操作。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是熟悉或希望深入了解西门子PLC编程的人士。 使用场景及目标:①需要在工业控制系统中实施催款程序的企业;②希望通过增强动态密保功能提升系统安全性的企业;③希望掌握SCL编程技巧并应用于实际项目中的技术人员。 其他说明:该程序不仅提升了系统的安全性和可靠性,还在效率和准确性方面表现出色,为企业带来了更多商业机会和发展空间。

    数据库仓库管理系统课程设计.doc

    数据库仓库管理系统课程设计.doc

    数据库实验3.doc

    数据库实验3.doc

    基于映射关系的领域词典抽取算法.zip

    基于映射关系的领域词典抽取算法.zip

    工业自动化领域中基于西门子PLC与ABB机器人的立库码垛系统实现及应用

    内容概要:本文介绍了一个典型的工业自动化应用场景——立库码垛机,重点讲述了如何利用西门子PLC、ABB机器人、视觉系统(基恩士相机)、伺服轴和西门子变频器G120 Profinet等设备进行高效协同作业。文中详细描述了系统架构、设备选型、通信协议(MODBUS TCP)及其编程方法(SCL和梯形图混编),并展示了具体的程序实现与调试步骤。此外,还探讨了系统测试与优化过程,确保立库码垛机在不同工况下的稳定性和高性能表现。 适合人群:从事工业自动化领域的工程师和技术人员,特别是对PLC编程、机器人控制和视觉系统感兴趣的读者。 使用场景及目标:适用于需要提升物流与仓储中心自动化水平的企业和个人。目标是通过引入先进的自动化技术和设备,提高生产效率和精度,降低人工成本。 其他说明:本文不仅提供了详细的理论讲解,还包括丰富的实际操作经验分享,有助于读者更好地理解和掌握相关技术。

    基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)

    基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基于JavaWeb的学生信息管理系统课程设计源码+数据库+文档报告(99分项目)基

    同一套代码适配多种数据库最终方案代码示例

    同一套代码适配多种数据库最终方案代码示例

    新能源光伏综合自动化设备技术规范书.doc

    新能源光伏综合自动化设备技术规范书.doc

    文泰雕刻软件使用说明书上半部分.doc

    文泰雕刻软件使用说明书上半部分.doc

    三菱FX-5U PLC轴定位与Modbus RTU RS-485通信案例解析及应用

    内容概要:本文介绍了三菱FX-5U PLC在自动化生产线中的轴定位控制及其与测微计通过Modbus RTU RS-485通信的具体实现方法。文中详细描述了编程软件、PLC与触摸屏程序、地址规划表以及相关手册和视频教程的应用。通过实例展示了如何解决编程实践中遇到的各种挑战,如硬件接线和软件逻辑错误等问题。最终,成功实现了高精度的轴定位和稳定的数据通信。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对三菱FX系列PLC和Modbus RTU通信感兴趣的读者。 使用场景及目标:适用于希望深入了解三菱FX-5U PLC轴定位技术和Modbus RTU RS-485通信机制的专业人士。目标是掌握这两种关键技术的实际应用技巧,提高自动化系统的性能和可靠性。 其他说明:附带的编程示例有助于读者理解和实践文中提到的技术细节。同时提供的视频教程可以作为辅助学习材料,帮助初学者更快上手。

    电动两轮车领域的高性能FOC电机控制方案:基于国产芯片的成熟解决方案

    内容概要:本文介绍了应用于电动两轮车(如电动自行车、滑板车)的大厂成熟FOC电机控制方案。该方案基于国产Gd32F150芯片,提供了多种功能,包括转把三速切换、刹车功能、助力功能、电子刹车、欠压检测、巡航功能、铁塔王通讯、一键通、隐形限速、防盗功能、霍尔修复、自学习和故障显示等。此外,该方案配备上位机进行直观调试和波形显示,确保电机控制的稳定性和准确性。代码和PCB文件已更新并优化,适用于量产。 适合人群:电动两轮车制造商、硬件工程师、嵌入式系统开发者以及对电动出行设备感兴趣的爱好者。 使用场景及目标:① 提供稳定的电机控制方案,确保电动两轮车的安全性和可靠性;② 利用上位机进行高效调试,优化电机性能;③ 实现多种智能化功能,提升用户体验。 其他说明:该方案不仅适用于电动自行车和滑板车,还可以扩展到其他电动出行设备。其强大的功能和良好的兼容性使其成为电动出行设备开发的理想选择。

    基于COMSOL的原油脱水电-磁场耦合模型:双液滴聚结行为与影响因素分析 文档

    内容概要:本文介绍了利用COMSOL Multiphysics建立的原油脱水模型,重点探讨了在外加交流电场条件下,原油乳化液中双液滴的聚结行为及其影响因素。模型通过耦合静电场、层流场和电流守恒场,精确模拟了电场强度、界面张力和液滴直径等因素对聚结速率的影响。研究表明,适当的电场强度(如3 MV/m)可以显著提高聚结效率,而过高或过低的电场强度则可能导致相反效果。此外,界面张力和液滴直径也在聚结过程中起到关键作用,特别是当界面张力低于0.01 N/m时,液滴会迅速合并。仿真结果显示,最佳聚结速度并不出现在最高电场强度处,而是存在一个最优值。 适用人群:从事石油工程、化学工程及相关领域的研究人员和技术人员。 使用场景及目标:适用于需要解决原油脱水问题的炼油厂和其他相关企业。目标是通过优化电场条件和物理参数,提升原油脱水效率,降低生产成本。 其他说明:文中提供了具体的MATLAB代码片段用于创建和调整模型,以及详细的参数设置方法,为实际应用提供了指导。同时,强调了电场和流场耦合的重要性,提出了传统方法之外的新思路。

    教育类网站建设方案介绍.doc

    教育类网站建设方案介绍.doc

    西门子1200 PLC程序管理汽车零部件压装工艺:12位置压力位移采集与工艺流程简化

    内容概要:本文详细介绍了基于西门子1200系列PLC的汽车零部件压装工艺管理系统。该系统针对12个压装位置的压力和位移数据采集进行了优化,采用模块化编程方式,实现了复杂工艺流程的简化。文中具体描述了数据采集功能块的设计,包括双缓冲采集机制、压力和位移传感器的数据处理方法以及状态机架构的应用。此外,还讨论了工位协同控制、交流电机调速、版本兼容性等问题,并展示了系统的实际应用效果,如压装不良率显著降低。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和汽车制造工艺感兴趣的读者。 使用场景及目标:适用于需要提高生产效率和质量控制的汽车零部件制造企业。主要目标是通过先进的PLC编程技术和数据采集手段,优化生产工艺流程,减少不良品率。 其他说明:文中提供了具体的编程实例和解决方案,有助于读者理解和应用相关技术。

Global site tag (gtag.js) - Google Analytics