当前位置:  编程技术>移动开发
本页文章导读:
    ▪关于多点抚摸进行缩放图片的原理        关于多点触摸进行缩放图片的原理 1.如果DOWN时的两点的距离太小可以当作拖曳处理。   2.DOWN时的两点的距离同UP时两点的距离的比值,当作缩放图片的比例的参考值。   3.ImageView.setImageMatrix .........
    ▪ Object-C学习(1)        Object-C学习(一) 引用:http://blog.csdn.net/huanglx1984/article/details/4290437objective c是一种c语言的变种,所以有时候在objective c中能看到写c语言的影子。先列举几个浅显的objective c和c 的不同之处.........
    ▪ 怎么用metersToEquatorPixels实现任意纬度的米到像素的转换       如何用metersToEquatorPixels实现任意纬度的米到像素的转换 今天又是神奇的发现:我希望在MapView的Overlay子类里画一个半径为 R米 的圆,于是用 metersToEquatorPixels 函数,将一个距离  R米 转换为一.........

[1]关于多点抚摸进行缩放图片的原理
    来源: 互联网  发布时间: 2014-02-18
关于多点触摸进行缩放图片的原理

1.如果DOWN时的两点的距离太小可以当作拖曳处理。

 

2.DOWN时的两点的距离同UP时两点的距离的比值,当作缩放图片的比例的参考值。

 

3.ImageView.setImageMatrix (Matrix   matrix),把scale设给matrix就能达到缩放的效果了。


    
[2] Object-C学习(1)
    来源: 互联网  发布时间: 2014-02-18
Object-C学习(一)
引用:http://blog.csdn.net/huanglx1984/article/details/4290437



objective c是一种c语言的变种,所以有时候在objective c中能看到写c语言的影子。

先列举几个浅显的objective c和c 的不同之处吧

1. objective c使用 nil 来表示 NULL



2. objective c用 YES NO 来表示 true false



3. objective c用 #import<stdio.h> 而不是#include<stdio.h>来包含头文件



4. 在objective c中,我们称类的方法(method)为消息(message)。在C++中,我们这样来调用方法: aClass->function(var); 但是在objective c中,我们使用 [aClass function:var]

objective c中的消息(message)比较有意思的特点是:

1) 调用消息的类可以不知道如何响应这个消息。如果它不知道如何处理这个消息,它会自动的将这个消息转给其他的类,比如它的父类;

2)调用消息的类可以是nil。在C++中,在使用类方法之前,我们都需要检查对象是否为空,所以在实现析构函数的时候,常会有如下的代码,如if (var) { delete var; } 但是在objective c中,我们就可以直接写[var release];  即使var == nil, 也不会有问题。



照着老规矩,先写个hello world

#import <stdio.h>

int main( int argc, char* argv[] ) {

   printf( "hello world/n" );

   return 1;


}



确实跟C很像吧。但是也不其然,objective c是一个很好的面向对象的语言。跟C还是有挺多不同之处。



我们先实现一个简单的类。

// Sample.h


#import <Foundation/NSObject.h>

@interface Sample: NSObject {

   int a;


}

- (void) print;

- (void) setA: (int)a;


@end



咱们一句一句来看。

#import <Foundation/NSObject.h>

在objective c中,所有的类都必须继承NSObject,这个概念很想Java里面的Object。



objective c声明类的格式如下:

@interface className: baseClassName {

   member variables;


}

member functions


@end



大家可能注意到objective c中函数的声明挺有特点的,我们现在来解释:

objective c的函数声明的基本格式如下

-/+ (return type) function_name;


-/+ (return type) function_name : (parameter type) parameter;

-/+ (return type) function_name : (parameter type) parameter1 otherParameter : (parameter_type) parameter2;

1) -/+: 这个称做scope, 如果在函数前面是- ,那么理解为一般的函数;如果是+, 可以理解为c++中的static函数

2) 函数的参数声明: objective c和 c++, java都很不一样。

如果没有参数的话,在函数名后面,可以什么都不写;

如果只有一个参数,在 : 后面声明参数的类型和名称;

如果有多个参数的话,每个参数前面都要有一个 : , 然后接着是参数类型和参数名称。可是大家可能还是觉得很奇怪。比如上面这个例子中, otherParameter 这个东西是干什么的呢?在objective c中,对于有多个参数的函数,我们可以理解为将函数的名称拆成了几个部分,每个部分都是对紧接着的参数的一个解释。比如在C++中:void initializeRectangle(int x1, int y1, int x2, int y2) , 但是我们并不知道这些参数都是什么意思;但是在objective c中,我们可以这样声明:void initializeRectangeWithLeftUpX: (int)x1 LeftUpY: (int)y1 RightBottomX: (int)x2 RightBottomY:(int)y2;

怎么样?有感觉了吧。



下面来实现这个简单的Sample类

// sample.m

#import <stdio.h>

#import "Sample.h"


@implementation Sample

- (void) print {

    printf( "%d/n", a );


}

- (void) setA : (int) aa {

   a = aa;


}


@end



使用这个类

#import "Sample.h"

int main( int argc, char* argv[] ) {

    Sample* smp = [[Sample alloc] init];

    [smp setA:1];

    [smp print];

    [smp release];


}

在objective c中,每一个类的对象都是一个指针,这和Java差不多(每个类的对象都用new声明)。alloc类似于C中的malloc, init是NSObject中的方法,用于初始化这个对象。如果我们实现了自己的初始化方法,也可以调用自己的初始化方法。使用完毕后,需要调用release释放空间。

在iPhone开发中,需要特别注意内存的管理。今后还会仔细些这部分的内容。

    
[3] 怎么用metersToEquatorPixels实现任意纬度的米到像素的转换
    来源: 互联网  发布时间: 2014-02-18
如何用metersToEquatorPixels实现任意纬度的米到像素的转换

今天又是神奇的发现:我希望在MapView的Overlay子类里画一个半径为 R米 的圆,于是用 metersToEquatorPixels 函数,将一个距离  R米 转换为一个以当前缩放等级下像素为单位的距离。调用的时候也没太注意,结果画出来的圆确实让我费解了阵子,仔细一看发现Equator这个单词,于是大概有点明白了。查了一下etersToEquatorPixels 函数的解释:该方法把以米为计量单位的距离(沿赤道)在当前缩放水平下转换到一个以像素(水平)为计量单位的距离。在默认的Mercator投影变换下,对于给定的距离,当远离赤道时,变换后确切的像素数量会增加。

SO,解决办法就是要将赤道,也就是零纬度的米对应的像素距离换算成我们需要的纬度的 米 对应的像素距离。我们可以写这么一个方法来实现:

 

public static int metersToRadius(float meters, MapView map, double latitude)  {  
    return (int) (map.getProjection().metersToEquatorPixels(meters) /(Math.cos(Math.toRadians(latitude))));  
} 

 

 

 
当然重点就是 /(Math.cos(Math.toRadians(latitude))) 这一串了。其实看了下面的这幅图,结合一下初高中的几何知识,不难明白为什么要这么写。



 

以上转自: http://cosyattic.com/archives/152

 

以下原创:

 

其实也可以这么理解,根据“GOOGLE MAP 源码”(关于源码,请参见:http://rainbow702.iteye.com/blog/1124280),我们可以看到该方法的实现:

public float metersToEquatorPixels(float meters) {
    return (float)meters*circumference /CIRCUMFERENCE_IN_METERS);
}

 

而 circumference 与 CIRCUMFERENCE_IN_METERS 又分别是什么呢?如下:

private static final double CIRCUMFERENCE_IN_METERS = 40075160.0;
private int tiles = 1 << zoomLevel;
private double circumference = tileSize * tiles;

 

 其中, zoomLevel 是你的 MapView 当前的缩放比例,tileSize 定义如下:

private MapSourceInfo mapSourceInfo = new CloudmadeSourceInfo("b06a3135a4eb5848a225483969f56967");
private int tileSize = mapSourceInfo.getTileSize();

CloudmadeSourceInfo 类的定义如下:
class CloudmadeSourceInfo implements MapSourceInfo {
    private final String apiKey; 
    private final int tileSize;
    private final int style;
    private final String attribution = 
      "\u00a9 2009 CloudMade - Map data CC-BY-SA 2009\nOpenStreetMap.org contributors - Terms of Use";
    
    CloudmadeSourceInfo(String apiKey) {
        this(apiKey, 256);
    }
    CloudmadeSourceInfo(String apiKey, int tileSize) {
        this(apiKey, tileSize, 1);
    }
    CloudmadeSourceInfo(String apiKey, int tileSize, int style) {
        this.apiKey = apiKey;
        this.tileSize = tileSize;
        this.style = style;
    }
    public int getMaxZoom() {
        return 18;
    }

    public String getName() {
        return "Open Street Maps Cloudmade renderer";
    }

    public String getTileUri(int x, int y, int zoom) {
        return "http://b.tile.cloudmade.com/"+ apiKey +"/" + style + "/" + tileSize + "/" + zoom + "/" + x + "/" + y + ".png";
    }

    public int getTileSize() {
        return tileSize;
    }

    public String getAttribution() {
      return attribution;
    }

}

 

所以,假设赤道的半径为 R,我们所处的纬度为 α 度的平面(如上图红线所画的平面)的半径为 r,那么应该有以下等式成立(请再看一下metersToEquatorPixels的实现):

meters * (circumference /2πR) = P
meters * (circumference / 2πr) = p

 以上,P 是在赤道上 meters 米对应的像素的长度,而 p 是在 α 度纬度上 meters 米对应的像素的长度,进而可以得出以下等式:

2πR * P = 2πr * p

 从而,最终得出以下等式:

2πR * P = 2πr * p

p = (R / r) * P

 那么, (R / r) 是什么呢,请看上图,只要是学习简单的立体几何的人应该都可以看来吧。对,它就等于 sec (α), 亦即原帖中所得的结果 1/cos (α)。

 

这样一来,大家都应该知道是怎么一回事了吧。希望对看到这篇博客的人有所帮助。

1 楼 Rainbow702 2011-07-28  
Math.cos(Math.toRadians(latitude))  这里之所以要使用 toRadians 方法,是因为 cos 的参数要求是以弧度为单位的。

    
最新技术文章:
▪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(请将#改为@)

linux iis7站长之家