高德地圖圖標隨位置選轉(zhuǎn)和放射動畫效果

GitHub地址:https://github.com/LoveYourselfAndMe/GaoDeMapView



下面是全部代碼復(fù)制粘貼即可

packagecom.cheyifu.businessapp.ui;

importandroid.graphics.BitmapFactory;

importandroid.graphics.Color;

importandroid.os.Bundle;

importandroid.os.SystemClock;

importandroid.support.v7.app.AppCompatActivity;

importandroid.util.Log;

importandroid.view.animation.CycleInterpolator;

importandroid.view.animation.Interpolator;

importandroid.view.animation.LinearInterpolator;

importcom.amap.api.location.AMapLocation;

importcom.amap.api.location.AMapLocationClient;

importcom.amap.api.location.AMapLocationClientOption;

importcom.amap.api.location.AMapLocationListener;

importcom.amap.api.maps.AMap;

importcom.amap.api.maps.CameraUpdateFactory;

importcom.amap.api.maps.LocationSource;

importcom.amap.api.maps.MapView;

importcom.amap.api.maps.UiSettings;

importcom.amap.api.maps.model.BitmapDescriptorFactory;

importcom.amap.api.maps.model.Circle;

importcom.amap.api.maps.model.CircleOptions;

importcom.amap.api.maps.model.LatLng;

importcom.amap.api.maps.model.Marker;

importcom.amap.api.maps.model.MarkerOptions;

importcom.cheyifu.businessapp.R;

importcom.cheyifu.businessapp.utils.SensorEventHelper;

importjava.util.Timer;

importjava.util.TimerTask;

public classMapActivityextendsAppCompatActivityimplementsLocationSource,

AMapLocationListener,AMap.OnMapLoadedListener,AMap.OnMapClickListener {

privateMapViewmapView;

privateAMapaMap;

privateUiSettingsmUiSettings;

privateOnLocationChangedListenermListener;

privateAMapLocationClientmlocationClient;

privateAMapLocationClientOptionmLocationOption;

//? ? private static final int STROKE_COLOR = Color.argb(180, 3, 145, 255);

//? ? private static final int FILL_COLOR = Color.argb(10, 0, 0, 180);

private booleanmFirstFix=false;

privateMarkermLocMarker;

privateSensorEventHelpermSensorHelper;

privateCirclemCircle;

privateCirclec;

privatecircleTaskmTimerTask;

private longstart;

privateTimermTimer=newTimer();

private finalInterpolatorinterpolator=newCycleInterpolator(1);

private finalInterpolatorinterpolator1=newLinearInterpolator();

privateCircleac;

@Override

protected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_map);

mapView= (MapView) findViewById(R.id.mapview);

mapView.onCreate(savedInstanceState);

initMapView();

}

private voidinitMapView() {

if(aMap==null) {

aMap=mapView.getMap();

mUiSettings=aMap.getUiSettings();

}

setUpMap();

mSensorHelper=newSensorEventHelper(this);

if(mSensorHelper!=null) {

mSensorHelper.registerSensorListener();

}

}

/**

* 設(shè)置一些amap的屬性

*/

private voidsetUpMap() {

aMap.setOnMapLoadedListener(this);

aMap.setOnMapClickListener(this);

aMap.setLocationSource(this);// 設(shè)置定位監(jiān)聽

//設(shè)置比例尺

mUiSettings.setScaleControlsEnabled(true);

//設(shè)置指南針

mUiSettings.setCompassEnabled(true);

//定位按鈕

mUiSettings.setMyLocationButtonEnabled(true);

aMap.setMyLocationEnabled(true);

// 設(shè)置定位的類型為定位模式 癌椿,可以由定位扶供、跟隨或地圖根據(jù)面向方向旋轉(zhuǎn)幾種

aMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);

}

@Override

protected voidonDestroy() {

super.onDestroy();

if(mLocMarker!=null) {

mLocMarker.destroy();

}

mapView.onDestroy();

if(null!=mlocationClient) {

mlocationClient.onDestroy();

}

if(mTimerTask!=null) {

mTimerTask.cancel();

mTimerTask=null;

}

try{

mTimer.cancel();

}catch(Throwable e) {

e.printStackTrace();

}

}

@Override

protected voidonResume() {

super.onResume();

mapView.onResume();

if(mSensorHelper!=null) {

mSensorHelper.registerSensorListener();

}

}

@Override

protected voidonPause() {

super.onPause();

if(mSensorHelper!=null) {

mSensorHelper.unRegisterSensorListener();

mSensorHelper.setCurrentMarker(null);

mSensorHelper=null;

}

mapView.onPause();

deactivate();

}

/**

* 停止定位

*/

@Override

public voiddeactivate() {

mListener=null;

if(mlocationClient!=null) {

mlocationClient.stopLocation();

mlocationClient.onDestroy();

}

mlocationClient=null;

}

@Override

protected voidonSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

mapView.onSaveInstanceState(outState);

}

@Override

public voidonLocationChanged(AMapLocation aMapLocation) {

if(mListener!=null&& aMapLocation !=null) {

if(mTimerTask!=null) {

mTimerTask.cancel();

mTimerTask=null;

}

if(aMapLocation !=null&& aMapLocation.getErrorCode() ==0) {

LatLng mylocation =newLatLng(aMapLocation.getLatitude(),

aMapLocation.getLongitude());

aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mylocation,18));

addLocationMarker(aMapLocation);

mSensorHelper.setCurrentMarker(mLocMarker);//定位圖標旋轉(zhuǎn)

}else{

String errText ="定位失敗,"+ aMapLocation.getErrorCode() +": "

+ aMapLocation.getErrorInfo();

Log.e("AmapErr",errText);

}

}

}

private voidaddLocationMarker(AMapLocation aMapLocation) {

LatLng mylocation =newLatLng(aMapLocation.getLatitude(),aMapLocation.getLongitude());

floataccuracy = aMapLocation.getAccuracy();

if(mLocMarker==null) {

addMarker(mylocation);

ac=aMap.addCircle(newCircleOptions().center(mylocation)

.fillColor(Color.argb(100,255,218,185)).radius(accuracy)

.strokeColor(Color.argb(255,255,228,185)).strokeWidth(5));

c=aMap.addCircle(newCircleOptions().center(mylocation)

.fillColor(Color.argb(70,255,218,185))

.radius(accuracy).strokeColor(Color.argb(255,255,228,185))

.strokeWidth(0));

}else{

mLocMarker.setPosition(mylocation);

ac.setCenter(mylocation);

ac.setRadius(accuracy);

c.setCenter(mylocation);

c.setRadius(accuracy);

}

Scalecircle(c);

}

/**

* 開始定位原茅。

*/

private voidstartlocation() {

if(mlocationClient==null) {

mlocationClient=newAMapLocationClient(this);

mLocationOption=newAMapLocationClientOption();

//設(shè)置定位監(jiān)聽

mlocationClient.setLocationListener(this);

//設(shè)置為高精度定位模式

mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);

//設(shè)置定位時間

//是指定位間隔

mLocationOption.setInterval(10000);

//設(shè)置定位參數(shù)

mlocationClient.setLocationOption(mLocationOption);

// 此方法為每隔固定時間會發(fā)起一次定位請求贾惦,為了減少電量消耗或網(wǎng)絡(luò)流量消耗滴某,

// 注意設(shè)置合適的定位時間的間隔(最小間隔支持為2000ms)辫诅,并且在合適時間調(diào)用stopLocation()方法來取消定位請求

// 在定位結(jié)束后催式,在合適的生命周期調(diào)用onDestroy()方法

// 在單次定位情況下临庇,定位無論成功與否,都無需調(diào)用stopLocation()方法移除請求麸塞,定位sdk內(nèi)部會移除

mlocationClient.startLocation();

}else{

mlocationClient.startLocation();

}

}

@Override

public voidactivate(OnLocationChangedListener listener) {

mListener= listener;

startlocation();

}

private voidaddMarker(LatLng latlng) {

if(mLocMarker!=null) {

return;

}

MarkerOptions options =newMarkerOptions();

options.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(this.getResources(),

R.mipmap.navi_map_gps_locked)));

options.anchor(0.5f,0.5f);

options.position(latlng);

mLocMarker=aMap.addMarker(options);

//? ? ? ? mLocMarker.setTitle(LOCATION_MARKER_FLAG);

}

@Override

public voidonMapClick(LatLng latLng) {

}

@Override

public voidonMapLoaded() {

}

public voidScalecircle(finalCircle circle) {

start= SystemClock.uptimeMillis();

mTimerTask=newcircleTask(circle,1000);

mTimer.schedule(mTimerTask,0,30);

}

private classcircleTaskextendsTimerTask {

private doubler;

privateCirclecircle;

private longduration=1000;

publiccircleTask(Circle circle, longrate) {

this.circle= circle;

this.r= circle.getRadius();

if(rate >0) {

this.duration= rate;

}

}

@Override

public voidrun() {

try{

longelapsed = SystemClock.uptimeMillis() -start;

floatinput = (float) elapsed /duration;

//? ? ? ? ? ? ? ? 外圈循環(huán)縮放

//? ? ? ? ? ? ? ? float t = interpolator.getInterpolation((float)(input-0.25));//return (float)(Math.sin(2 * mCycles * Math.PI * input))

//? ? ? ? ? ? ? ? double r1 = (t + 2) * r;

//? ? ? ? ? ? ? ? 外圈放大后消失

floatt =interpolator1.getInterpolation(input);

doubler1 = (t +1) *r;

circle.setRadius(r1);

if(input >2) {

start= SystemClock.uptimeMillis();

}

}catch(Throwable e) {

e.printStackTrace();

}

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秃臣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子哪工,更是在濱河造成了極大的恐慌奥此,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雁比,死亡現(xiàn)場離奇詭異稚虎,居然都是意外死亡,警方通過查閱死者的電腦和手機偎捎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門蠢终,熙熙樓的掌柜王于貴愁眉苦臉地迎上來序攘,“玉大人,你說我怎么就攤上這事寻拂〕痰欤” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵祭钉,是天一觀的道長瞄沙。 經(jīng)常有香客問我,道長慌核,這世上最難降的妖魔是什么帕识? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮遂铡,結(jié)果婚禮上肮疗,老公的妹妹穿的比我還像新娘。我一直安慰自己扒接,他們只是感情好伪货,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钾怔,像睡著了一般碱呼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宗侦,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天愚臀,我揣著相機與錄音,去河邊找鬼矾利。 笑死姑裂,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的男旗。 我是一名探鬼主播舶斧,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼察皇!你這毒婦竟也來了茴厉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤什荣,失蹤者是張志新(化名)和其女友劉穎矾缓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稻爬,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡嗜闻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了因篇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泞辐。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡笔横,死狀恐怖竞滓,靈堂內(nèi)的尸體忽然破棺而出咐吼,到底是詐尸還是另有隱情,我是刑警寧澤商佑,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布锯茄,位于F島的核電站,受9級特大地震影響茶没,放射性物質(zhì)發(fā)生泄漏肌幽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一抓半、第九天 我趴在偏房一處隱蔽的房頂上張望喂急。 院中可真熱鬧,春花似錦笛求、人聲如沸廊移。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狡孔。三九已至,卻和暖如春蜂嗽,著一層夾襖步出監(jiān)牢的瞬間苗膝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工植旧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辱揭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓病附,卻偏偏與公主長得像界阁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胖喳,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容