当前位置:  编程技术>移动开发
本页文章导读:
    ▪List的有用兑现 1.ArrayList 2.LinkedList 3.Vector 4.Stack        List的有用实现 1.ArrayList 2.LinkedList 3.Vector 4.Stack * *   * List的有用实现 1.ArrayList 2.LinkedList 3.Vector 4.Stack *   * 讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习) * ArrayList与Vector都.........
    ▪ 横向滚动条上端或尾端事件        横向滚动条顶端或尾端事件 #功能:当横向滚动条滚到顶端时,左箭头灰掉;当滚到尾端时,右箭头灰掉;当滚到中间时,左右箭头水红色; 效果如下图   <!-- /res/layout/horizontal_view_demo.xml .........
    ▪ 取得两点间的GPS距离       获得两点间的GPS距离 现在LBS越来越流行,计算地理位置的距离的需求十分普及,以下我就分享一下自己平时用来获得两点间的GPS距离的实用方法: 在android中可采用如下代码获取距离: Jav.........

[1]List的有用兑现 1.ArrayList 2.LinkedList 3.Vector 4.Stack
    来源: 互联网  发布时间: 2014-02-18
List的有用实现 1.ArrayList 2.LinkedList 3.Vector 4.Stack

*
 * 
 * List的有用实现 1.ArrayList 2.LinkedList 3.Vector 4.Stack
 * 
 * 讨论1:底层机制(牵扯到的数据结构的知识请读者自行复习)
 * ArrayList与Vector都是基于数组实现的,这就说明ArrayList与Vector适合做遍历而不适合做频繁的插入和删除。
 * vector是线程同步的,所以它也是线程安全的,而arraylist是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用arraylist效率比较高。
 * 如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.
 * 如过在集合中使用数据量比较大的数据,用vector有一定的优势
 * LinkedList是基于链表实现的,所以它生来就是为了频繁插入与删除对象。
 * 
 * 讨论2:特殊功能 Stack是一个后进先出(LIFO)对象堆栈,而LinkedList除可以被用作堆栈外,还可以被用作队列或双端队列。
 * 不同的是Stack继承自Vector,也就是说它也是基于数组实现的。
 * 
 * 讨论3:内存占用 基于数组实现的List,在动态扩展时会产生新的数组,然后把旧数组里的内容复制到新数组里,
 * 这会产生大量的不再被使用的对象引用变量等待系统回收。而基于链表实现的List就不会有这种问题。
 * 
 * 讨论4:同步问题 Vector与Stack生来就是同步的,
 * 而ArrayList与LinkedList需要使用Collections.synchronizedList(List list)方法来转换成同步List。
 * 从它们的对象上返回的迭代器是快速失败的,也就是说在使用迭代器进行迭代的时候,必须使用迭代器本身的remove、add、set
 * 方法来添加或更改List元素,如果在迭代的同时,在其他线程中从结构上修改了List(结构上的修改是指任何添加或删除一个或多
 * 个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改),快速失败迭代器会尽最大努力抛出ConcurrentModificationException。
 * 
 * 讨论5:使用策略
 * 如果数据被从数据源提取,数据量不确定,该数据一经被提取后就几乎不会再添加或删除,那么应该建立一个LinkedList来保存从数据源中取出的数据,然后将
 * 该LinkedList转换成ArrayList来优化遍历操作。反过来,数据量确定的数据从数据源取出可以先建立一个ArrayList来保存,根据需要如需频繁增删,就转换为LinkedList,
 * 如频繁遍历就不需转换。
 * 转换的方法就是使用对应的List类来封装目标List对象。
 * 如 ArrayList al = new ArrayList(); 
 * LinkedList ll = new LinkedList(al); 
 * 同理反过来也可以 LinkedList ll = new LinkedList(); 
 * ArrayList al = new ArrayList(ll);
 * 
 * 讨论6:toArray()方法
 * 基于数组实现的List会直接返回一个底层数组的拷贝(使用了System.arraycopy方法),基于链表实现的List会新生成一个数组。
 * 
 * 讨论7:不可修改 通过使用Collections.unmodifiableList(List
 * list)来生成一个不可修改的List,试图修改返回的列表,不管是直接修改还是通过其迭代器进行修改,都将导致抛出UnsupportedOperationException。
 * 
 * 讨论8:遍历器 请尽量使用Iterator,Enumeration已不被鼓励使用。
 */


    
[2] 横向滚动条上端或尾端事件
    来源: 互联网  发布时间: 2014-02-18
横向滚动条顶端或尾端事件

#功能:当横向滚动条滚到顶端时,左箭头灰掉;当滚到尾端时,右箭头灰掉;当滚到中间时,左右箭头水红色;

效果如下图


 

<!-- /res/layout/horizontal_view_demo.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <LinearLayout
	  xmlns:android="http://schemas.android.com/apk/res/android"
	  android:orientation="horizontal"
	  android:layout_width="fill_parent"
	  android:layout_height="40dp">
  <TextView android:id="@+id/h_left"
  	android:layout_width="13dp"
  	android:layout_height="fill_parent"
  	android:textSize="20dp"
  	android:gravity="center"
  	android:background="@color/grey"
  	android:text="<"/>
  <HorizontalScrollView android:id="@+id/h_horizontal"
  	android:layout_width="200dp"
  	android:layout_height="fill_parent"
  	android:layout_weight="1"
  	android:scrollbars="none">
  	<LinearLayout
	  xmlns:android="http://schemas.android.com/apk/res/android"
	  android:orientation="horizontal"
	  android:layout_width="fill_parent"
	  android:layout_height="fill_parent">
	  <TextView android:id="@+id/h_t1"
	  	android:layout_width="70dp"
	  	android:layout_height="fill_parent"
	  	android:textSize="20dp"
	  	android:gravity="center"
	  	android:layout_margin="1dp"
	  	android:background="#666666"
	  	android:text="人事部"/>
	  <TextView android:id="@+id/h_t2"
	  	android:layout_width="70dp"
	  	android:layout_height="fill_parent"
	  	android:textSize="20dp"
	  	android:gravity="center"
	  	android:layout_margin="1dp"
	  	android:background="#666666"
	  	android:text="账务部"/>
	  <TextView android:id="@+id/h_t3"
	  	android:layout_width="70dp"
	  	android:layout_height="fill_parent"
	  	android:textSize="20dp"
	  	android:gravity="center"
	  	android:layout_margin="1dp"
	  	android:background="#666666"
	  	android:text="技术部"/>
	  <TextView android:id="@+id/h_t4"
	  	android:layout_width="70dp"
	  	android:layout_height="fill_parent"
	  	android:textSize="20dp"
	  	android:gravity="center"
	  	android:layout_margin="1dp"
	  	android:background="#666666"
	  	android:text="销售部"/>
	  <TextView android:id="@+id/h_t5"
	  	android:layout_width="70dp"
	  	android:layout_height="fill_parent"
	  	android:textSize="20dp"
	  	android:gravity="center"
	  	android:layout_margin="1dp"
	  	android:background="#666666"
	  	android:text="制作部"/>
	  <TextView android:id="@+id/h_t6"
	  	android:layout_width="70dp"
	  	android:layout_height="fill_parent"
	  	android:textSize="20dp"
	  	android:gravity="center"
	  	android:layout_margin="1dp"
	  	android:background="#666666"
	  	android:text="设计部"/>
	  <TextView android:id="@+id/h_t7"
	  	android:layout_width="70dp"
	  	android:layout_height="fill_parent"
	  	android:textSize="20dp"
	  	android:gravity="center"
	  	android:layout_margin="1dp"
	  	android:background="#666666"
	  	android:text="行政部"/>
	</LinearLayout>
  </HorizontalScrollView>
  <TextView android:id="@+id/h_right"
  	android:layout_width="13dp"
  	android:layout_height="fill_parent"
  	android:textSize="20dp"
  	android:gravity="center"
  	android:background="@color/pink"
  	android:text=">"/>
  </LinearLayout>
</LinearLayout>

 

public class HorizontalViewDemo extends Activity {
	private HorizontalScrollView hsv;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.horizontal_view_demo);
		
		hsv = (HorizontalScrollView)findViewById(R.id.h_horizontal);
		hsv.setOnTouchListener(new OnTouchListener(){
			@Override
			public boolean onTouch(View view, MotionEvent me) {
				TextView hLeft = (TextView)findViewById(R.id.h_left);
				TextView hRight = (TextView)findViewById(R.id.h_right);
				if (hsv.getScrollX() == 0) {
					hLeft.setBackgroundResource(R.color.grey);
				} else if (hsv.getScrollX() > 0) {
					hLeft.setBackgroundResource(R.color.pink);
				}
				if (hsv.getScrollX() == 210) {//210这个值在不同像数需要改变
					hRight.setBackgroundResource(R.color.grey);
				} else if (hsv.getScrollX() < 210) {
					hRight.setBackgroundResource(R.color.pink);
				}
				return false;
			}
		});
	}
}


    
[3] 取得两点间的GPS距离
    来源: 互联网  发布时间: 2014-02-18
获得两点间的GPS距离
现在LBS越来越流行,计算地理位置的距离的需求十分普及,以下我就分享一下自己平时用来获得两点间的GPS距离的实用方法:

在android中可采用如下代码获取距离:

Java代码

public double getDistance(double lat1, double lon1,
 double lat2, double lon2) {
        float[] results=new float[1];
        Location.distanceBetween(lat1, lon1, lat2, lon2, results);
        return results[0];
}
 


在其他设备若没有类似android的Location的distanceBetween方法,可以采用如下代码获取,该方法的参数为正常的经纬度数据,将返回以KM为单位的值:


Java代码

public static double geo_distance(double lat1, double lng1, double lat2,
			double lng2) {
		// earth's mean radius in KM
		double r = 6378.137;
		lat1 = Math.toRadians(lat1);
		lng1 = Math.toRadians(lng1);
		lat2 = Math.toRadians(lat2);
		lng2 = Math.toRadians(lng2);
		double d1 = Math.abs(lat1 - lat2);
		double d2 = Math.abs(lng1 - lng2);
		double p = Math.pow(Math.sin(d1 / 2), 2) + Math.cos(lat1)
				* Math.cos(lat2) * Math.pow(Math.sin(d2 / 2), 2);
		double dis = r * 2 * Math.asin(Math.sqrt(p));
		return dis;
	}
 
更多地采用类似google map的地理位置参数可以参考以下方法,实用弧度作为参数,并返回外国流行的mile作为单位的值:

//将角度转换为弧度
public static double deg2rad(double degree) {
        return degree / 180 * Math.PI;
}
//将弧度转换为角度
public static double rad2deg(double radian) {
        return radian * 180 / Math.PI;
}
 
double distance(double lat1, double lon1, double lat2, double lon2) {
        double theta = lon1 - lon2;
        double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))
                                + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))
                                * Math.cos(deg2rad(theta));
        dist = Math.acos(dist);
        dist = rad2deg(dist);
        double miles = dist * 60 * 1.1515;
        return miles;}

这个计算得出的结果是英里,如果要转换成公里,需要乘以1.609344,若是海里需要乘以0.8684.

 

最后在提供另一思路,采用weiservice请求方式,直接获取返回的更为精准的结果,例如实用国内比较有名的地图服务提供商MapABC的webservice接口:

 

http://search1.mapabc.com/sisserver?highLight=false&config=CDX&ver=2.0&x1= ??? &y1= ??? &x2= ??? &y2= ??? &enc=utf-8&resType=json & a_k= "your key" &ctx=1933347&a_nocache=715403361154

 

以json格式返回结果,使用时注意要到其官网 申请一key...

 

 

 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3