精华内容
下载资源
问答
  • andoid的man

    2015-01-10 15:50:51
    Multiple annotations found at this line: - error: Error: No resource found that matches the given name (at 'icon' with value '@drawable/icon'). - Should explicitly set android:allowBackup to true...
  • 从入门开始,也是从别人哪里下载的,分享给大家.不不想要分的,可必须选择
  • Andoid服务(Service)

    2020-07-03 22:26:19
    Andoid服务(Service) 版权 Android服务(Service) 服务是一个后台运行的组件,执行长时间运行且不需要用户交互的任务。应用被销毁时也依然可以工作 服务的两种状态: started:通过startServer()启动的服务,一旦...

    Andoid服务(Service)

    版权

    Android服务(Service)
    服务是一个后台运行的组件,执行长时间运行且不需要用户交互的任务。应用被销毁时也依然可以工作

    服务的两种状态:

    started:通过startServer()启动的服务,一旦启动,服务可以在后台一直运行
    bound:通过bindServer()绑定的服务,Bound状态的服务,提供了一个客户服务器接口来允许组件与服务进行交互,如发送请求,获得结果,甚至可以通过IPC来进行跨进程通信

    服务的生命周期: onCreat…

    创建一个服务
    创建一个服务需要继承Service类

    介绍Service类的回调方法

    1.onStartCommand() 其他组件(如活动)通过调用startService()来请求启动服务时,系统调用该方法。如果你实现该方法,你有责任在工作完成时通过stopSelf()或者stopService()方法来停止服务。
    onBind() 当其他组件想要通过bindService()来绑定服务时,系统调用该方法。如果你实现该方法,你需要返回IBinder对象来提供一个接口,以便客户来与服务通信。你必须实现该方法,如果你不允许绑定,则直接返回null。

    1. onUnbind() 当客户中断所有服务发布的特殊接口时,系统调用该方法。
    2. onRebind() 当新的客户端与服务连接,且此前它已经通过onUnbind(Intent)通知断开连接时,系统调用该方法。
    3. onCreate() 当服务通过onStartCommand()和onBind()被第一次创建的时候,系统调用该方法。该调用要求执行一次性安装。
    4. onDestroy() 当服务不再有用或者被销毁时,系统调用该方法。你的服务需要实现该方法来清理任何资源,如线程,已注册的监听器,接收器等。
    展开全文
  • andriod短信整合备份发送到gmail邮箱,需要在andoid手机配置好gmail邮箱,下面是具体的实现代码,感兴趣的朋友可以参考下哈
  • 如何有效控制Andoid应用的耗电量
  • andoid位置定位DEMO

    2018-10-09 16:03:51
    andoid位置定位DEMO
  • Andoid 开发入门

    2018-01-02 10:29:30
    从入门开始,也是从别人哪里下载的,不不想要分的,可必须选择
  • andoid手势相关

    2019-07-31 02:27:55
    NULL 博文链接:https://contentprovider.iteye.com/blog/1014550
  • 从Linux命令行制作Andoid APK 根据make.sh文件中的android-sdk安装路径,编辑“ AAPT,DX,ZIPALIGN,APKSIGNER,PLATFORM”变量 ./make.sh
  • Andoid自定义标题栏示例工程,包括标题栏的图标、文字、背景、高度的自定义设置演示。
  • Andoid侧滑菜单

    2018-09-01 23:03:32
    Android Material Design菜单控件NavigationView的用法
  • 如何有效控制Andoid应用的耗电量
  • andoid串口通信

    2018-07-12 14:57:40
    本人熟悉串口通信,可以c#和android开发,如果调试不行可以直接联系我
  • 吉比特 这是Gee blootooth API支持Andoid BT应用程序 需要将该项目从bitbucket中移出还有一个演示,放在某个地方: : 去做 移动到gradle 创建演示项目的示例文件夹
  • Andoid X迁移资料.7z

    2020-07-02 10:43:20
    Android support 迁移到 Android X的映射表 ,含组件和API的映射。 官网的映射表地址 https://developer.android.google.cn/jetpack/androidx/migrate/class-mappings?hl=zh_cn
  • Recetarium免费 食堂
  • andoid开发书籍

    2017-11-29 09:48:06
    android开发类精简书籍,适合初学者,书中介绍比较详细,适合没有基础的人
  • Andoid自动判断输入是电话,网址或者Email的方法----Linkify的应用,本教程主讲的是,当我们在一个EditText输入电话或者网址还是Email的时候,让Android自动判断,当我们输入的是电话,我们点击输入内容将调用打电话程序,...
  • andoid-tictactoe 从 code.google.com/p/andoid-tictactoe 自动导出 屏幕图片
  • 基于LIEPA项目的立陶宛语合成TTS引擎(https://www.xn--ratija-ckb.lt/liepa/infrastrukturines-paslaugos/elektroninio-teksto-skaitytuvas/7563)
  • AndoidX详解

    2019-11-05 09:53:10
    一.Android Studio将support库改成Androidx 为什么转换? 最近 Google 发布了 Android support library 28,同时也发布了 androidx 1.0.0 第一个正式版本,然后得知支持库的 “28.0.0” 将会是最后一次更新,之后的...

    一.Android Studio将support库改成Androidx

    为什么转换?
    最近 Google 发布了 Android support library 28,同时也发布了 androidx 1.0.0 第一个正式版本,然后得知支持库的 “28.0.0” 将会是最后一次更新,之后的更新都会迁移到 Androidx 中,所以没办法,只能把项目依赖也迁移到 Androidx 了

    1.1在Android Studio中Refactor中选择Migrate to AndroidX

    1.2在gradle.properties文件中添加以下两行

    二.解决Android Studio主 module 引用不到依赖module 里的依赖库

    将  implementation  “xx依赖包”改为api “xx依赖包”

    三.Androidx新旧包对照表

    旧版本包与AndroidX对照表

    旧包AndroidX
    android.arch.core:commonandroidx.arch.core:core-common:2.0.0-rc01
    android.arch.core:coreandroidx.arch.core:core:2.0.0-rc01
    android.arch.core:core-testingandroidx.arch.core:core-testing:2.0.0-rc01
    android.arch.core:runtimeandroidx.arch.core:core-runtime:2.0.0-rc01
    android.arch.lifecycle:commonandroidx.lifecycle:lifecycle-common:2.0.0-rc01
    android.arch.lifecycle:common-java8androidx.lifecycle:lifecycle-common-java8:2.0.0-rc01
    android.arch.lifecycle:compilerandroidx.lifecycle:lifecycle-compiler:2.0.0-rc01
    android.arch.lifecycle:extensionsandroidx.lifecycle:lifecycle-extensions:2.0.0-rc01
    android.arch.lifecycle:livedataandroidx.lifecycle:lifecycle-livedata:2.0.0-rc01
    android.arch.lifecycle:livedata-coreandroidx.lifecycle:lifecycle-livedata-core:2.0.0-rc01
    android.arch.lifecycle:reactivestreamsandroidx.lifecycle:lifecycle-reactivestreams:2.0.0-rc01
    android.arch.lifecycle:runtimeandroidx.lifecycle:lifecycle-runtime:2.0.0-rc01
    android.arch.lifecycle:viewmodelandroidx.lifecycle:lifecycle-viewmodel:2.0.0-rc01
    android.arch.paging:commonandroidx.paging:paging-common:2.0.0-rc01
    android.arch.paging:runtimeandroidx.paging:paging-runtime:2.0.0-rc01
    android.arch.paging:rxjava2androidx.paging:paging-rxjava2:2.0.0-rc01
    android.arch.persistence.room:commonandroidx.room:room-common:2.0.0-rc01
    android.arch.persistence.room:compilerandroidx.room:room-compiler:2.0.0-rc01
    android.arch.persistence.room:guavaandroidx.room:room-guava:2.0.0-rc01
    android.arch.persistence.room:migrationandroidx.room:room-migration:2.0.0-rc01
    android.arch.persistence.room:runtimeandroidx.room:room-runtime:2.0.0-rc01
    android.arch.persistence.room:rxjava2androidx.room:room-rxjava2:2.0.0-rc01
    android.arch.persistence.room:testingandroidx.room:room-testing:2.0.0-rc01
    android.arch.persistence:dbandroidx.sqlite:sqlite:2.0.0-rc01
    android.arch.persistence:db-frameworkandroidx.sqlite:sqlite-framework:2.0.0-rc01
    com.android.support.constraint:constraint-layoutandroidx.constraintlayout:constraintlayout:1.1.2
    com.android.support.constraint:constraint-layout-solverandroidx.constraintlayout:constraintlayout-solver:1.1.2
    com.android.support.test.espresso.idling:idling-concurrentandroidx.test.espresso.idling:idling-concurrent:3.1.0
    com.android.support.test.espresso.idling:idling-netandroidx.test.espresso.idling:idling-net:3.1.0
    com.android.support.test.espresso:espresso-accessibilityandroidx.test.espresso:espresso-accessibility:3.1.0
    com.android.support.test.espresso:espresso-contribandroidx.test.espresso:espresso-contrib:3.1.0
    com.android.support.test.espresso:espresso-coreandroidx.test.espresso:espresso-core:3.1.0
    com.android.support.test.espresso:espresso-idling-resourceandroidx.test.espresso:espresso-idling-resource:3.1.0
    com.android.support.test.espresso:espresso-intentsandroidx.test.espresso:espresso-intents:3.1.0
    com.android.support.test.espresso:espresso-remoteandroidx.test.espresso:espresso-remote:3.1.0
    com.android.support.test.espresso:espresso-webandroidx.test.espresso:espresso-web:3.1.0
    com.android.support.test.janktesthelper:janktesthelperandroidx.test.jank:janktesthelper:1.0.1
    com.android.support.test.services:test-servicesandroidx.test:test-services:1.1.0
    com.android.support.test.uiautomator:uiautomatorandroidx.test.uiautomator:uiautomator:2.2.0
    com.android.support.test:monitorandroidx.test:monitor:1.1.0
    com.android.support.test:orchestratorandroidx.test:orchestrator:1.1.0
    com.android.support.test:rulesandroidx.test:rules:1.1.0
    com.android.support.test:runnerandroidx.test:runner:1.1.0
    com.android.support:animated-vector-drawableandroidx.vectordrawable:vectordrawable-animated:1.0.0
    com.android.support:appcompat-v7androidx.appcompat:appcompat:1.0.0
    com.android.support:asynclayoutinflaterandroidx.asynclayoutinflater:asynclayoutinflater:1.0.0
    com.android.support:carandroidx.car:car:1.0.0-alpha5
    com.android.support:cardview-v7androidx.cardview:cardview:1.0.0
    com.android.support:collectionsandroidx.collection:collection:1.0.0
    com.android.support:coordinatorlayoutandroidx.coordinatorlayout:coordinatorlayout:1.0.0
    com.android.support:cursoradapterandroidx.cursoradapter:cursoradapter:1.0.0
    com.android.support:customtabsandroidx.browser:browser:1.0.0
    com.android.support:customviewandroidx.customview:customview:1.0.0
    com.android.support:designcom.google.android.material:material:1.0.0-rc01
    com.android.support:documentfileandroidx.documentfile:documentfile:1.0.0
    com.android.support:drawerlayoutandroidx.drawerlayout:drawerlayout:1.0.0
    com.android.support:exifinterfaceandroidx.exifinterface:exifinterface:1.0.0
    com.android.support:gridlayout-v7androidx.gridlayout:gridlayout:1.0.0
    com.android.support:heifwriterandroidx.heifwriter:heifwriter:1.0.0
    com.android.support:interpolatorandroidx.interpolator:interpolator:1.0.0
    com.android.support:leanback-v17androidx.leanback:leanback:1.0.0
    com.android.support:loaderandroidx.loader:loader:1.0.0
    com.android.support:localbroadcastmanagerandroidx.localbroadcastmanager:localbroadcastmanager:1.0.0
    com.android.support:media2androidx.media2:media2:1.0.0-alpha03
    com.android.support:media2-exoplayerandroidx.media2:media2-exoplayer:1.0.0-alpha01
    com.android.support:mediarouter-v7androidx.mediarouter:mediarouter:1.0.0
    com.android.support:multidexandroidx.multidex:multidex:2.0.0
    com.android.support:multidex-instrumentationandroidx.multidex:multidex-instrumentation:2.0.0
    com.android.support:palette-v7androidx.palette:palette:1.0.0
    com.android.support:percentandroidx.percentlayout:percentlayout:1.0.0
    com.android.support:preference-leanback-v17androidx.leanback:leanback-preference:1.0.0
    com.android.support:preference-v14androidx.legacy:legacy-preference-v14:1.0.0
    com.android.support:preference-v7androidx.preference:preference:1.0.0
    com.android.support:printandroidx.print:print:1.0.0
    com.android.support:recommendationandroidx.recommendation:recommendation:1.0.0
    com.android.support:recyclerview-selectionandroidx.recyclerview:recyclerview-selection:1.0.0
    com.android.support:recyclerview-v7androidx.recyclerview:recyclerview:1.0.0
    com.android.support:slices-buildersandroidx.slice:slice-builders:1.0.0
    com.android.support:slices-coreandroidx.slice:slice-core:1.0.0
    com.android.support:slices-viewandroidx.slice:slice-view:1.0.0
    com.android.support:slidingpanelayoutandroidx.slidingpanelayout:slidingpanelayout:1.0.0
    com.android.support:support-annotationsandroidx.annotation:annotation:1.0.0
    com.android.support:support-compatandroidx.core:core:1.0.0
    com.android.support:support-contentandroidx.contentpager:contentpager:1.0.0
    com.android.support:support-core-uiandroidx.legacy:legacy-support-core-ui:1.0.0
    com.android.support:support-core-utilsandroidx.legacy:legacy-support-core-utils:1.0.0
    com.android.support:support-dynamic-animationandroidx.dynamicanimation:dynamicanimation:1.0.0
    com.android.support:support-emojiandroidx.emoji:emoji:1.0.0
    com.android.support:support-emoji-appcompatandroidx.emoji:emoji-appcompat:1.0.0
    com.android.support:support-emoji-bundledandroidx.emoji:emoji-bundled:1.0.0
    com.android.support:support-fragmentandroidx.fragment:fragment:1.0.0
    com.android.support:support-media-compatandroidx.media:media:1.0.0
    com.android.support:support-tv-providerandroidx.tvprovider:tvprovider:1.0.0
    com.android.support:support-v13androidx.legacy:legacy-support-v13:1.0.0
    com.android.support:support-v4androidx.legacy:legacy-support-v4:1.0.0
    com.android.support:support-vector-drawableandroidx.vectordrawable:vectordrawable:1.0.0
    com.android.support:swiperefreshlayoutandroidx.swiperefreshlayout:swiperefreshlayout:1.0.0
    com.android.support:textclassifierandroidx.textclassifier:textclassifier:1.0.0
    com.android.support:transitionandroidx.transition:transition:1.0.0
    com.android.support:versionedparcelableandroidx.versionedparcelable:versionedparcelable:1.0.0
    com.android.support:viewpagerandroidx.viewpager:viewpager:1.0.0
    com.android.support:wearandroidx.wear:wear:1.0.0
    com.android.support:webkitandroidx.webkit:webkit:1.0.0
    展开全文
  • 从入门开始,也是从别人哪里下载的,分享给大家.不不想要分的,可必须选择
  • 新版本AndroidStudio创建无andoidx项目 下面开始: 首先创建一个项目, Start a new Android Studio project ....next 创建成功后: 下面是关键部分 继续: 返回主页面,切换为Project视角浏览项目...

    新版本AndroidStudio创建无andoidx项目

    下面开始:

    首先创建一个项目,

    Start a new Android Studio project ....next

    创建成功后:

    下面是关键部分

    继续:

    返回主页面,切换为Project视角浏览项目,将androidx改为false

    修改好后,点击右上角同步,

    再进行下面的操作:对app下的build.gradle进行修改, 核心部分是Version修改

    需要修改的部分如下所示:

    1.修改相关的Version版本如下,2.删除带androidx的test  3.在dependencies{}下添加:(复制下面)

    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:27.1.1'

     最终修改后的build文件如下,(可以选择能运行的,注意不能需要version29)

    最后点击右上角同步-》

    如果同步失败没关系,会提示没有这个sdk,在下面会有报错,点击install accept就可以了。

    安装成功后,会重新加载这时基本已经成功了,不要着急,还有最后两步。

     

    进入布局文件去除相关androidx字段

    修改布局为LinearLayout, 并且将TextView中的四个app:layout删除,如下

    下面是最后一步,删除Test文件,并删除MainActivity中的import  androidx.appcompat....这一行

    此时会发现AppCompatActivity飘红,鼠标放上去,按 Alt+Enter ,重新进行import

    完成,此时已经无androidx,run,hello world~

    展开全文
  • tugaswtcshop
  • andoid仿真翻页库,里面有sample apk.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • PAGE / NUMPAGES 上文已经详细介绍了Handler 与Looper等对象的关系并且提到了Handler对象的两种构造方法对于Handler(Looper looper)的具体用途在本文中进行详细的描述 官方对Handler(Looper looper)的解释如下 Use ...
  • andoid 二维码生成,自带中心logo.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
  • Andoid事件机制

    2020-03-08 21:45:32
    1.理论Api事件: MontionEvent 触碰操作 download 产生一次,按下 move 这里的move会调用多次 up 产生一次,松开 getX():获取X轴坐标,原始发生事键按钮自己 getRawX(): 现对于屏幕左上角 ...

    1.理论Api事件:

     MontionEvent  触碰操作
        download  产生一次,按下    
        move  这里的move会调用多次  
        up     产生一次,松开
        
        getX():获取X轴坐标,原始发生事键按钮自己
        getRawX():  现对于屏幕左上角
        
        屏幕类型:
        电阻屏:按下压力感应,软屏
        电容屏:现对于低电流来感应屏幕,硬屏
        事件传播:
        屏幕-》Linxu 内核-》传递到当期应用-》当前Activity-》事件分发dispachTouchEvent(MontionEvent event)
        ->  按钮响应事件
        -》 如果按钮消费,那么Activity自己处理

     1.  案例1: 事件分发

    main.xml 布局文件: 

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Father -->
    <com.qqyumidi.event.TouchEventFather xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="320dp"
        android:layout_height="480dp"
        android:background="#468AD7"
        android:gravity="center"
        android:orientation="vertical">
        <!-- Childs -->
        <com.qqyumidi.event.TouchEventChilds
            android:gravity="center"
            android:id="@+id/childs"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_gravity="center"
            android:background="#66ff0000">
          <!--MyView -->
            <com.qqyumidi.event.MyView
                android:id="@+id/myview"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:background="#000"/>
    
    
        </com.qqyumidi.event.TouchEventChilds>
    
    </com.qqyumidi.event.TouchEventFather>
    
    
    TouchEventFather 
    package com.qqyumidi.event;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.widget.LinearLayout;
    
    public class TouchEventFather extends LinearLayout {
    
    
    	String Tag="denganzhi";
    
    
    	public TouchEventFather(Context context) {
    		super(context);
    	}
    
    	public TouchEventFather(Context context, AttributeSet attrs) {
    		super(context, attrs);
    	}
    
    	public boolean dispatchTouchEvent(MotionEvent ev) {
    		Log.e(Tag, "Father | dispatchTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
    		return super.dispatchTouchEvent(ev);
    //		return true;
    	}
    
    	public boolean onInterceptTouchEvent(MotionEvent ev) {
    		Log.i(Tag, "Father | onInterceptTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
    	//	return super.onInterceptTouchEvent(ev);
    		return true;
    		//return false;
    	}
    
    	public boolean onTouchEvent(MotionEvent ev) {
    		Log.d(Tag, "Father | onTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
    		return super.onTouchEvent(ev);
    //		return true;
    	}
    
    }
    
    TouchEventChilds:
    package com.qqyumidi.event;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.LinearLayout;
    import android.widget.Scroller;
    
    public class TouchEventChilds extends LinearLayout {
    	private  View childView;
    	private Scroller scroller;
    	String Tag="denganzhi";
    	@Override
    	protected void onFinishInflate() {
    		super.onFinishInflate();
    
    //		childView = getChildAt(0);
    	}
    
    	public TouchEventChilds(Context context) {
    		super(context);
    	}
    
    	public TouchEventChilds(Context context, AttributeSet attrs) {
    		super(context, attrs);
    //		scroller = new Scroller(context) ;
    	}
    
    	public boolean dispatchTouchEvent(MotionEvent ev) {
    		Log.e(Tag, "Childs | dispatchTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
    		return super.dispatchTouchEvent(ev);
    //		return true;
    	}
    
    	public boolean onInterceptTouchEvent(MotionEvent ev) {
    		Log.e(Tag, "Childs | onInterceptTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
    		return super.onInterceptTouchEvent(ev);
    //		return true;
    	}
    
    	public boolean onTouchEvent(MotionEvent ev) {
    	Log.e(Tag, "Childs | onTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
    		return super.onTouchEvent(ev);
    //		return true;
    	}
    	
    }
    
    MyView:
    package com.qqyumidi.event;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    
    /**
     * Created by denganzhi on 2020/3/26.
     */
    
    public class MyView extends View {
        String Tag="denganzhi";
    
        public MyView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            Log.e(Tag, "MyView | dispatchTouchEvent --> " + TouchEventUtil.getTouchAction(event.getAction()));
            return super.dispatchTouchEvent(event);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            Log.e(Tag, "MyView | onTouchEvent --> " + TouchEventUtil.getTouchAction(event.getAction()));
         //   return super.onTouchEvent(event);
            return true;
        }
    
    
    
    }
    
     
    TouchEventActivity  代码: 
    package com.qqyumidi.event;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    
    public class TouchEventActivity extends Activity {
    
    	String Tag="denganzhi";
    
    	MyView myview;
    
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    
    		myview = (MyView)findViewById(R.id.myview);
    
    		myview.setOnTouchListener(new View.OnTouchListener() {
    			@Override
    			public boolean onTouch(View v, MotionEvent event) {
    				Log.e(Tag,"TouchEventActivity->myview.setOnTouchListener:"+TouchEventUtil.getTouchAction(event.getAction()));
    				return true;
    			}
    		});
    	}
    
    	@Override
    	public boolean dispatchTouchEvent(MotionEvent ev) {
    		Log.e(Tag, "Activity | dispatchTouchEvent --> " + TouchEventUtil.getTouchAction(ev.getAction()));
    		return super.dispatchTouchEvent(ev);
    //		return true;
    	}
    
    
    	@Override
    	public boolean onTouchEvent(MotionEvent event) {
    		Log.e (Tag, "Activity | onTouchEvent --> " + TouchEventUtil.getTouchAction(event.getAction()));
    		return super.onTouchEvent(event);
    	}
    
    
    
    }

    事件分发 分析:

     1.Activity | dispatchTouchEvent --> ACTION_DOWN      Activity分发 
     Father | dispatchTouchEvent --> ACTION_DOWN        分发
     Father | onInterceptTouchEvent --> ACTION_DOWN     拦截   false,不拦截,往下分发,
     如果拦截,事件交给Activity | onTouchEvent 消费
     
     
    2. Childs | dispatchTouchEvent --> ACTION_DOWN         分发到ViewGroup
        Childs | onInterceptTouchEvent --> ACTION_DOWN       拦截  false,不拦截,往下分发
     
     3. MyView | dispatchTouchEvent --> ACTION_DOWN          分发到View
     TouchEventActivity->myview.setOnTouchListener:ACTION_DOWN    触发setOnToucher
     返回true,消费
     返回false,不消费,往下调用
     MyView | onTouchEvent --> ACTION_DOWN                   触发Touch,不消费,返回false  
     

     4.Childs | onTouchEvent --> ACTION_DOWN                 View不消费往上传递,返回false,不消费,继续往上传递 
     Father | onTouchEvent --> ACTION_DOWN                 返回false,不消费,继续往上传递
     Activity | onTouchEvent --> ACTION_DOWN               返回false,不消费,继续往上传递到顶端,最终消费
        
        
    ACTION_DOWN 事件被Acticity消费,那么ACTION_MOVE 事件不下发了,直接交给Activity的onTouchEvent 事件消费
        如果 ACTION_DOWN 被 Father| Childs 消费,事件逐层下发
     Activity | dispatchTouchEvent --> ACTION_MOVE          
      Activity | onTouchEvent --> ACTION_MOVE
      
      Activity | dispatchTouchEvent --> ACTION_UP
       Activity | onTouchEvent --> ACTION_UP
       后续.......

    *****************************************************************     

       viewGroup事件传递:
        //事件分发, 返回true, 不继续分发,没有被消费
        // 返回false 继续往下分发,如果是ViewGroup 分发给 onInterceptHoverEvent 进行判断是否拦截该事件

    onInterceptHoverEvent 只有ViewGroup才有, 负责事件拦截,
        返回true, 拦截事件, 不继续往下分发, 交给自身的 onTouchEvent进行处理 
        返回false, 继续往下传递

     

        ***最底层View首先调用,activity最后调用
        onTouchEvent方法进行时间处理,返回true消费,
        返回false, View 往上传递,  最终Acticity的 OnTouchEvent消费
        返回false, ViewGroup 往下传递

    *****************************************************************     

    案例2: 事件分发

    activity_main.xml 布局文件: 

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="lanya.denganzhi.com.montioneventtest.Main2Activity"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/moveImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@mipmap/ic_launcher"
            android:layout_marginLeft="30dp"
            android:layout_marginTop="50dp"/>
    
    </LinearLayout>
    

    MyImageView  代码: 

    package lanya.denganzhi.com.montioneventtest;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.ImageView;
    
    /**
     * Created by Administrator on 20-3-8.
     */
    public class MyImageView extends android.support.v7.widget.AppCompatImageView {
        public MyImageView(Context context) {
            super(context);
        }
        public MyImageView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
      // 分发
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
    
            Log.e("denganzhi","ImageView--dispatchTouchEvent:"+event.getAction());
            return super.dispatchTouchEvent(event);
        }
        // 处理
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            Log.e("denganzhi","ImageView--onTouchEvent:"+event.getAction());
    
            return super.onTouchEvent(event);
        }
    }
    

     MainActivity  代码:

    package lanya.denganzhi.com.montioneventtest;
    
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        MyImageView myImageView=null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            myImageView = (MyImageView) findViewById(R.id.myImageView);
            myImageView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    Log.e("denganzhi","myImageView--setOnTouchListener:"+event.getAction());
                    return true;
                }
            });
        }
        //
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            Log.e("denganzhi","MainActivity--dispatchTouchEvent:"+event.getAction());
    
            return super.dispatchTouchEvent(event);
        }
        //
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            Log.e("denganzhi","MainActivity--onTouchEvent:"+event.getAction());
            //  MotionEvent.ACTION_DOWN   0
            // MotionEvent.ACTION_MOVE  // 1
            //  MotionEvent.ACTION_UP    //2
    
            return super.onTouchEvent(event);
        }
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            Log.e("denganzhi1","key--dispatch:"+event.getKeyCode());
            return super.dispatchKeyEvent(event);
        }
    }
    

    *****************************************************************     
        View Api:
        boolean onTouchEvnet(MontionEvent evnet) : 调用了方法叫处理了,返回true才表示消费该事件
        
    down事件:
         MainActivity--dispatchTouchEvent:0        down事件,activity分发
         ImageView--dispatchTouchEvent:0        activity分发给imageview
         myImageView--setOnTouchListener:0                imageview的setOnTouch事件调用,不消费,往上传递

         ImageView--onTouchEvent:0            imageview 的重写 onTouch方法调用
         MainActivity--onTouchEvent:0         activity的重写 onTouch方法调用,最终消费时间
    move事件: 
       MainActivity--dispatchTouchEvent:2
        MainActivity--onTouchEvent:2      // move事件都不调用ImageViw的dispatch分发了,直接activity消费 

    up事件:
       MainActivity--dispatchTouchEvent:1  // up事件都不调用ImageViw的dispatch分发了,直接activity消费 
       MainActivity--onTouchEvent:1

     总结:要是第一次down事件不消费,后面的move,up事件不会分发了
    *****************************************************************   
    down事件: 
        myImageView.setOnTouchListener 返回true
         MainActivity--dispatchTouchEvent:0        down事件,activity分发
         ImageView--dispatchTouchEvent:0        activity分发给imageview
         myImageView--setOnTouchListener:0      返回true,那么时间已经被消费了,时间停止
        
      move事件: 
       MainActivity--dispatchTouchEvent:2
        ImageView--dispatchTouchEvent:2     
       myImageView--setOnTouchListener:2   消费
       
        up事件:
       MainActivity--dispatchTouchEvent:1
       ImageView--dispatchTouchEvent:1
     myImageView--setOnTouchListener:1    消费
     
     *****************************************************************************************

     2.  实现图片拖拽功能:

     View 视图Api:
       getLeft()、getTop():  左上角顶点坐标现对于原点坐标
       getRight()、getBottom()  右下角相对于原点坐标
       layout(int left,top,right,bottom): 对视图进行重新定位

     *****************************************************************
     实现图片拖动伪代码:
      实现图片拖动原理:
      lastX
      lastY
      eventX
      eventY 
     MontionEvent.down
      // 1.获取按下点坐标
       lastX=  event.getRawX();
       lastY= evnet.getRawY();
     MontionEvent.move
         // 2.获取move相对于down移动距离
        eventX =event.getRawX();
        eventY =  event.getRawY();
        dx =  eventX - lastX;
        dy =  eventY- lastY; 
        // 3.重新定位
        left= imageview.getLeft()+ dx;
        top = imageview.getTop() + dy;
        right = imageview.getRight() + dx;
        bottom = imageview.getBottom + dy:
        imageview.layout(left,top,right,bottom)
        //4. 下次移动做准备
        lastX= eventX
        lastY= eventY
    *****************************************************************

    源码: 

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="lanya.denganzhi.com.montioneventtest.Main2Activity"
        android:orientation="vertical">
    
        <ImageView
            android:id="@+id/moveImg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@mipmap/ic_launcher"
            android:layout_marginLeft="30dp"
            android:layout_marginTop="50dp"/>
    
    </LinearLayout>
    
    Main2Activity  代码:
    package lanya.denganzhi.com.montioneventtest;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    
    public class Main2Activity extends AppCompatActivity {
    
        ImageView moveImg;
        float lastX ,lastY  ;  //上次位移
        float  eventX , eventY; // 当前坐标
        private LinearLayout parent;
        float parentBottom,parentRight;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
    
            moveImg = (ImageView)findViewById(R.id.moveImg);
    
            parent = (LinearLayout) moveImg.getParent();  //parentBottom、parentRight 马上去取为0
            moveImg.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
    
                    switch (event.getAction()){
    
                        case MotionEvent.ACTION_DOWN:
    
                            // 得到父视图的 right/bottom
                            if(parentRight==0){
                                parentRight= parent.getRight();
                                parentBottom= parent.getBottom();
                            }
                            lastX= event.getRawX();
                            lastY =event.getRawY();
    
                            break;
    
                        case MotionEvent.ACTION_MOVE:
                            eventX = event.getRawX();
                            eventY = event.getRawY();
    
    
                            float dx= eventX -lastX;
                            float dy= eventY -lastY;
                            float left = moveImg.getLeft() + dx;
                            float top =moveImg.getTop() + dy;
                            float right = moveImg.getRight() + dx;
                            float bottom = moveImg.getBottom() + dy;
    
                            // 不能移动到外面去
                            if(left<0){
                                right = right + (-left);
                                left=0; // 那么已经移除了left,right也要复原,加上移除的left
    
                            }
                           // 不能移出到左边
                            if(top < 0){
                                bottom = bottom + (-top);
                                top = 0;
                            }
                            // 不能移出到右边
                            if(right > parentRight){
                                left= left - (right - parentRight);
                                right= parentRight;
                            }
                            if(bottom > parentBottom){
                                top = top - (bottom - parentBottom);
                                bottom = parentBottom;
                            }
                            moveImg.layout((int)left,(int)top,(int)right,(int)bottom);
                            lastX= eventX;
                            lastY=eventY;
                            break;
    
                        case MotionEvent.ACTION_UP:
    
                            break;
                    }
                    return true;
                }
            });
        }
    }
    

    上图:

    3.     KeyEvent: 事件

    基本类型:down:  手指按下, 会被调用多次
              up : 手指移动
       实现双击back键盘退出

        //
        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            Log.e("denganzhi","MainActivity--dispatchTouchEvent:"+event.getAction());
            return super.dispatchTouchEvent(event);
        }
        //
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            Log.e("denganzhi","MainActivity--onTouchEvent:"+event.getAction());
    
            //  MotionEvent.ACTION_DOWN   0
            // MotionEvent.ACTION_MOVE  // 1
            //  MotionEvent.ACTION_UP    //2
    
            return super.onTouchEvent(event);
        }
        @Override
        public boolean dispatchKeyEvent(KeyEvent event) {
            Log.e("denganzhi1","key--dispatch:"+event.getKeyCode());
            return super.dispatchKeyEvent(event);
        }
    
        // 会被 调用多次
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            // 如果要监听back,home键,必须设置下面这2个Api
            // startTracking 和  return true;
            event.startTracking();
            // event.getKeyCode()  //获取按键
            Log.e("denganzhi1","key--down");
            return true;
        }
        boolean isExit=false;
        Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if(msg.what==100){
                    isExit=false;
                }
    
            }
        };
        @Override
        public boolean onKeyUp(int keyCode, KeyEvent event) {
            Log.e("denganzhi1","key--up");
            if(event.getKeyCode() == KeyEvent.KEYCODE_BACK){
                if(!isExit){
                    isExit=true;
                    handler.sendEmptyMessageDelayed(100,4000);
                    Toast.makeText(MainActivity.this,"退出",Toast.LENGTH_SHORT).show();
                    return true;
                }
                // 否则退出 执行super,4s 以后 有需要双击
            }
            return super.onKeyUp(keyCode, event);
        }
    
        @Override
        protected void onDestroy() {
            handler.removeMessages(100);
            super.onDestroy();
        }
        // 长按监听
        @Override
        public boolean onKeyLongPress(int keyCode, KeyEvent event) {
            Log.e("denganzhi1","key--long");
            return super.onKeyLongPress(keyCode, event);
        }

     

    展开全文
  • andoid8.0 apn增加一个类型

    千次阅读 2018-11-24 15:17:59
    客户需求是增加一个默认apn,type是自定义的,如下: &lt;apn carrier="XXX" mcc="...在/alps/device/mediatek/config/apns-conf.xml里面增加,系统里面需要识别ptt这个类型,在应用上用如下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,924
精华内容 2,369
关键字:

andoid