首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

Android Map开发基础知识学习笔记

注册Android地图API密钥 运行:keytool -list -keystore ~/.android/debug.keystore 用得到的MD5码到http://code.google.com/intl/zh-CN/android/maps-api-signup.html注册API密钥。参考: http://www.cnblogs.com/feisky/archive/2010/01/17/1650083.html 注册完成后会得到如下的网页: 您的密钥是: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 此密钥适用于所有使用以下指纹所对应证书进行验证的应用程序: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX 下面是一个xml格式的示例,帮助您了解地图功能: <com.google.android.maps.MapView android:layout_width="fill_parent" android:layout_height="fill_parent"android:apiKey="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" /> 模拟器设置 建立一个"Google Inc.:Google APIs:3"的模拟器。 手机终端需要支持Google Add-ons 作为与Google合作的手机终端的制造商,如果想在自己的Android终端中集成Google的一些应用,例如map,market,picasa,sync等,需要和Google签约,这样Google会有专人帮你将这一系列服务整合到你的平台中来。 作为没有和Google合作的手机终端的制造商,我们可以使用破解的方法将Add-ons中的运行库整合到自己的framework中来(build到手机终端的system.img中)。操作如下: 1.在Android中,额外支持GoogleAdd-ons(Google Maps),需要将如下档案(从标准的SDK中pull出来的,也可以从GPhone中pull出来)打包进System.img。GoogleAdd-ons只需要1--2,Goolge Maps(Google的地图程序)需要1--5: 1)system/frameworkcom.google.android.maps.jar 2)system/etc/permissionscom.google.android.maps.xml 3)system/frameworkcom.google.android.gtalkservice.jar 4)system/etc/permissionscom.google.android.gtalkservice.xml 5)system/appMaps.apk (Google Maps v3.0) 2.源码:Android Cupcake Release(经测试,在donut平台同样适用。) 1)编译源码(为了生成out/target目录中Android最原始的东西) 2)将以上文件加入out/target/product/generic相应目录,在源码根目录使用make snod打包,获得新的system.img 权限和Maps库设置 在manifest.xml中设置全相应的权限,比如: <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/> 在manifest.xml中加上要用的maps库: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.package.name"> ... <application android:name="MyApplication"> <uses-library android:name="com.google.android.maps"/> ... </application> ... </manifest> Maps库分析 Maps库提供了十几个类,具体可以参考这里http://code.google.com/intl/ja/android/add-ons/google-apis/reference/index.html,包括Mapview,MapController,MapActivity等。 (1)MapController 控制地图移动,伸缩,以某个GPS坐标为中心,控制MapView中的view组件,管理Overlay,提供View的基本功能。使用多种地图模式(地图模式(某些城市可实时对交通状况进行更新),卫星模式,街景模式)来查看Google Map。 常用方法:animateTo(GeoPoint point)setCenter(GeoPoint point)setZoom(int zoomLevel)等。 (2)MapView Mapview是用来显示地图的view,它派生自android.view.ViewGroup。当MapView获得焦点,可以控制地图的移动和缩放。 地图可以以不同的形式来显示出来,如街景模式,卫星模式等,通过setSatellite(boolean)setTraffic(boolean), setStreetView(boolean)方法。 MapView只能被MapActivity来创建,这是因为mapview需要通过后台的线程来连接网络或者文件系统,而这些线程要由mapActivity来管理。 需要特别说明的一点是,android 1.5中,map的zoom采用了built-in机制,可以通过setBuiltInZoomControls(boolean)来设置是否在地图上显示zoom控件。 常用方法:getController()getOverlays()setSatellite(boolean)setTraffic(boolean),setStreetView(boolean)setBuiltInZoomControls(boolean)等。 (3)MapActivity 管理Activity的生命周期,为mapview建立及取消对map service的连接。 MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity。并且在其派生类的onCreate()中,都要创建一个MapView实例,可以通过MapViewconstructor (然后添加到View中ViewGroup.addView(View))或者通过layout XML来创建。 (4)Overlay Overlay是覆盖到MapView的最上层,可以扩展其ondraw接口,自定义在MapView中显示一些自己的东西。MapView通过MapView.getOverlays()对Overlay进行管理。 除了Overlay这个基类,Google还扩展了2个比较有用的Overlay 1)MylocationOverlay—集成了Android.location中接收当前坐标的接口,集成SersorManager中CompassSensor的接口 我们只需要enableMyLocation(),enableCompass就可以让我们的程序拥有实时的MyLocation以及Compass功能(Activity.onResume()中)。 2)ItemlizedOverlay—管理一个OverlayItem链表,用图片等资源在地图上作风格相同的标记。 (5)Projection:MapView中GPS坐标与设备坐标的转换(GeoPoint和Point)。 一个简单的小例子 用一个小程序来演示一下android中地图功能的开发。主要功能是实现了地图的缩放,添加了菜单,从而可以手动选择地图的显示模式等。 Step1:新建一个android project,注意这里要选择的buildtarget为"GoogleAPIs" Step 2:修改menifest文件: <?xmlversion="1.0"encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.map.prac" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET" /> <application android:icon="@drawable/icon"android:label="@string/app_name"> <uses-library android:name="com.google.android.maps" /> <activity android:name=".MapViewPrac2" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="3" /> </manifest> Step 3:修改layout文件,main.xml <?xmlversion="1.0"encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.google.android.maps.MapView android:id="@+id/map" android:layout_width="fill_parent" android:layout_height="fill_parent" android:enabled="true" android:clickable="true" android:apiKey="???????????????????????????????????" /> </LinearLayout> 这里需要将api key中的????????????改成你自己申请到的api key. Step4:修改代码: package feisky.navigation; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends MapActivity { // 地图显示控制相关变量定义 private MapView map=null; private MapController mapCon; // 菜单项 final private int menuMode=Menu.FIRST; final private int menuExit=Menu.FIRST+1; private int chooseItem=0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取MapView map=(MapView)findViewById(R.id.map); // 设置显示模式 map.setTraffic(true); map.setSatellite(false); map.setStreetView(true); // 设置可以缩放 map.setBuiltInZoomControls(true); // 设置初始地图的中心位置 GeoPoint geoBeijing=new GeoPoint((int)(39.95*1000000), (int)(116.37*1000000)); mapCon=map.getController(); mapCon.setCenter(geoBeijing); } @Override public boolean onCreateOptionsMenu(Menu menu) { // 建立菜单 menu.add(0,menuMode,0,"地图模式"); menu.add(0, menuExit, 1, "退出"); return super.onCreateOptionsMenu(menu); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return super.onKeyDown(keyCode, event); } @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { switch (item.getItemId()) { case menuExit: finish(); break; case menuMode: Dialog dMode=new AlertDialog.Builder(this) .setTitle("地图模式设置") .setSingleChoiceItems(R.array.MapMode, chooseItem, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { chooseItem=which; } }) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0: map.setSatellite(true); //map.setTraffic(false); //map.setStreetView(false); break; case 1: //map.setSatellite(false); map.setTraffic(true); //map.setStreetView(false); break; case 2: //map.setSatellite(false); //map.setTraffic(false); map.setStreetView(true); break; default: break; } } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .create(); dMode.show(); break; default: break; } return super.onMenuItemSelected(featureId, item); } @Override protected boolean isRouteDisplayed() { return false; } } 本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2010/01/20/1652230.html,如需转载请自行联系原作者

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

Android基础知识之Toolbar的使用

Toolbar是Android5.0推出的,用来替代ActionBar的控件.可以高度的自定义,使用灵活.官方的ToolBar是必须在5.0以上的系统才能使用,如果需要在低版本中使用.需要使用support v7包中的Toolbar。 下一是官网的Toolbar的介绍: Toolbar extendsViewGroup java.lang.Object ↳android.view.View ↳android.view.ViewGroup ↳android.support.v7.widget.Toolbar 使用前提 要使用ToolBar需要将activity的ActionBar隐藏掉.那么如何隐藏呢?有三种方法.下面分别介绍 方法一: 在res/values/styles.xml文件中修改 <stylename="AppTheme.Base"parent="Theme.AppCompat"> <itemname="windowActionBar">false</item> <itemname="android:windowNoTitle">true</item> </style> 也可以直接使用没有ActionBar的主题 <stylename="AppTheme"parent="Theme.AppCompat.Light.NoActionBar"> 方法二: 在清单文件中修改制定activity的主题,如下所示: <activityandroid:name="MainActivity" android:theme="@style/Theme.AppCompat.Light.NoActionBar"> </activity> 方法三: 直接在代码中取消. 在setContentView之前。 requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); //supportRequestWindowFeature(Window.FEATURE_NO_TITLE);在AppCompatActivity中 怎么使用 在布局文件中.添加如下代码. 位置不固定。 <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?android:attr/actionBarSize" android:background="?attr/colorPrimaryDark" app:title="Title" app:titleTextColor="#222222" app:logo="@mipmap/ic_launcher" app:subtitle="subtitle"></android.support.v7.widget.Toolbar> title 用来设置标题.subtitle设置副标题 titleTextColor用来设置标题字体颜色.background用来设置背景颜色..效果如下: 在java代码中也可以动态的设置这些值。 mToolbar.setTitle("JavaTitle"); mToolbar.setSubtitle("JavaSubTitle"); mToolbar.setLogo(R.mipmap.ic_launcher); mToolbar.setNavigationIcon(android.R.drawable.ic_input_delete); mToolbar.setOverflowIcon(ContextCompat.getDrawable(this,android.R.drawable.ic_menu_more)); /setActionBar(mToolbar);//activity中 setSupportActionBar(mToolbar);//AppCompatActivity中 添加Menu 要添加menu首先我们需要有menu,在这里我选择在res/menu/中创建main.xml来定义menu文件.代码如下 <?xmlversion="1.0"encoding="utf-8"?> <menuxmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/add" android:icon="@android:drawable/ic_menu_add" android:title="Add" app:showAsAction="never|withText"/> <item android:id="@+id/delete" android:icon="@android:drawable/ic_menu_delete" android:title="Delete" app:showAsAction="never|withText"/> <item android:id="@+id/edit" android:icon="@android:drawable/ic_menu_edit" android:title="Edit" app:showAsAction="never|withText"/> <item android:id="@+id/email" android:icon="@android:drawable/sym_action_email" android:title="Email" app:showAsAction="never|withText"/> </menu> 下面是java文件中的代码。 @Override publicbooleanonCreateOptionsMenu(Menumenu){ getMenuInflater().inflate(R.menu.main,menu); returntrue; } @Override publicbooleanonOptionsItemSelected(MenuItemitem){ switch(item.getItemId()){ caseandroid.R.id.home: Toast.makeText(MainActivity.this,"您点击了NavigationIcon",Toast.LENGTH_SHORT).show(); break; caseR.id.add: Toast.makeText(MainActivity.this,"Add",Toast.LENGTH_SHORT).show(); break; caseR.id.delete: Toast.makeText(MainActivity.this,"Delete",Toast.LENGTH_SHORT).show(); break; caseR.id.edit: Toast.makeText(MainActivity.this,"Edit",Toast.LENGTH_SHORT).show(); break; caseR.id.email: Toast.makeText(MainActivity.this,"Email",Toast.LENGTH_SHORT).show(); break; } returntrue; } 显示Menu中的Icon 在写到这里之后.我们会发现.隐藏的menu是不显示icon的,那么我们怎么设置呢: 只需要重新一下方法: 这里的activity是 AppCompatActivity @Override protectedbooleanonPrepareOptionsPanel(Viewview,Menumenu){ if(menu!=null){ if(menu.getClass()==MenuBuilder.class){ try{ Methodm=menu.getClass().getDeclaredMethod("setOptionalIconsVisible",Boolean.TYPE); m.setAccessible(true); m.invoke(menu,true); }catch(Exceptione){ Log.i("tag","onPrepareOptionsPanel:"+ getClass().getSimpleName()+ "onMenuOpened...unabletoseticonsforoverflowmenu" +e); } } } returnsuper.onPrepareOptionsPanel(view,menu); } 效果如下: 作者:Magicer 来源:51CTO

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

区块链技术基础:术语和用例

1. 区块和区块链 区块链是一种分布在整个业务网络上的共享账本。业务交易被永久记录在仅附加到账本的区块中。所有经过确认和证明的交易都从创始区块一直链接到最新的区块,因而得名区块链。区块链是自网络中的区块链启动以来发生的所有交易的历史记录。区块链被用作该网络的单一事实来源。 区块链网络可以是许可网络或无许可网络。无许可 网络向所有参与方开放,参照网络上的已有规则对交易进行验证。任何参与方都可以查看账本上的交易,即使参与方是匿名的。比特币是人们最熟悉的一个无许可网络示例。 另一方面,许可网络仅能由给定业务网络中的参与者访问。在许可区块链上,参与者只允许查看与他们相关的交易。Hyperledger Project 就是为支持许可区块链的开发而创立的。 2. 交易、资产和一致性 深入了解区块链网络概念 在 “分布式账本简介” 中了解区块链网络的优势。 交易 是传输到账本或从账本传出的资产。任何可被拥有或控制来产生价值的事物都是资产。资产可以是有形的(比如住宅或汽车)或无形的(比如抵押或租赁)。 账本中的条目被同步到网络中的所有账本。区块链网络中的参与方处理的每个账本副本被称为节点。节点之间的一致性 能确保共享账本是精确的副本,并降低发生交易欺诈的风险,因为篡改需要同时在许多地方进行。 要实现一致性,所有参与者都必须同意交易并通过对等网络验证它。参与者还可以建立验证交易的规则。与无许可区块链中存在的更高成本相比,受信任的参与者网络可减少在节点之间建立一致性的成本。 3. 密码哈希算法和数字签名 密码哈希算法(比如 SHA256 计算算法)利用可变大小的交易输入生成一个固定大小的唯一哈希值(被称为摘要)。哈希运算包含一个数学属性,那就是一个给定输入只能得到一个唯一的哈希值,但不能从哈希值推导出输入。一个给定的输入总是会计算出相同的哈希值。 对交易输入的任何修改或改动 — 甚至是最细微的更改 — 都会导致计算出不同的哈希值,这表明交易输入可能被损坏。因此,可使用哈希值检测交易输入的完整性。 数字签名可以确保接收者收到的交易数据中没有包含修改或伪造过的交易内容,还可以确保交易源自发送方(已使用私钥进行签名),而不是来自冒充者。 对称密钥加密使用一个私钥来加密和解密数据。该密钥必须使用一个安全网络进行共享,而数据可在不安全的网络上广播,但能由拥有该私钥的各方读取: 区块链技术使用了公钥加密,也称为非对称密钥加密。在公钥加密中,每个参与者都有一个公钥/私钥对。发送者可以使用接收者的公钥来加密数据。然后只能使用接收者的私钥读取文档或数据。非对称密钥加密在传输数据时无需使用安全网络来交换密钥。 4. 智能合约和链代码 要使用拟议的交易来更新账本,每个节点必须按照智能合约 的逻辑来处理交易。智能合约由直接在复制的网络上运行的程序组成。智能合约使用一种编程语言在区块链上对业务规则或合同进行编码,由网络中的所有参与者执行。这些程序在 Hyperledger Fabric 中称为链代码,它们被复制到网络中的每个节点,并由拥有权限的各方调用来传输资产。 链代码必须是确定的,也就是说,相同的输入必须始终产生相同的输出。因此,每个节点可以相信它和对等节点处理的是同一个交易。 5. 区块链应用 一个区块链应用需要 3 个相互依赖的组件:面向用户的应用、智能合约和账本。 顶层是面向用户的应用,用于满足网络参与者的需求。该应用让用户调用智能合约在业务网络中触发交易。智能合约 封装网络的业务逻辑:资产、所有权和传输方式。每次调用智能合约,都会在网络中创建一个交易并更新账本。账本 持有智能合约数据的当前值(如 vehicleOwner=Daisy),并分发到整个网络。 6. 区块链用例 区块链技术对许多行业而言是一种潜在的颠覆性技术,因为它能更顺利、更高效地组织活动。而且它能协调参与者之间更大规模的活动。下面给出了一些可从区块链技术中受益的用例: (1)物联网 设备管理 (2)医疗保健 电子医疗记录 病毒库 种子库备份 医生-供应商 RFP 服务和保险合同 区块链健康研究共享空间 区块链健康司法人员 (3)金融服务 信用证 公司债务和债券 交易平台 支付汇款 再购买协议 外汇 (4)保险 索赔处理 P2P 保险 所有权 销售和承保 (5)政府 政府招标程序 选举 税收 (6)工业 制造流程 (7)零售 顾客忠诚度 (8)跨行业 身份管理 信托行业 资本资产管理 (9)其他行业 游戏 音乐 作者:佚名 来源:51CTO

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册