This commit is contained in:
wangcongtao
2020-04-22 20:22:47 +08:00
parent a9cbb82420
commit c6378cfc07
7 changed files with 295 additions and 153 deletions

View File

@@ -65,7 +65,6 @@ public abstract class SubscribeImpl< T extends BaseData > implements Observer< T
}
public void onSuccess( T o ) {
Logger.e( TAG, GsonUtil.jsonFromObject( o ) );
}
public void onError( String message, int code ) {

View File

@@ -16,6 +16,7 @@ import com.amap.api.maps.model.animation.Animation;
import com.amap.api.maps.model.animation.ScaleAnimation;
import com.amap.api.maps.model.animation.TranslateAnimation;
import com.amap.api.maps.utils.overlay.MovingPointOverlay;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.map.MogoLatLng;
import com.mogo.map.impl.amap.AMapWrapper;
import com.mogo.map.impl.amap.utils.ObjectUtils;
@@ -24,6 +25,7 @@ import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.IMogoMarkerClickListener;
import com.mogo.map.marker.IMogoMarkerIconViewCreator;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.map.marker.anim.OnMarkerAnimationListener;
import com.mogo.utils.WindowUtils;
import com.mogo.utils.logger.Logger;
@@ -85,6 +87,11 @@ public class AMapMarkerWrapper implements IMogoMarker, Observer {
mMarker = null;
}
if (mMovingPointOverlay != null){
try {
mMovingPointOverlay.destroy();
} catch ( Exception e ) {
e.printStackTrace();
}
mMovingPointOverlay = null;
}
mMogoInfoWindowAdapter = null;
@@ -340,6 +347,86 @@ public class AMapMarkerWrapper implements IMogoMarker, Observer {
mMarker.startAnimation();
}
@Override
public void startScaleAnimation( float fromX, float toX, float fromY, float toY, int duration, Interpolator interpolator, OnMarkerAnimationListener listener ) {
if ( isDestroyed() ) {
return;
}
ScaleAnimation animationScale = new ScaleAnimation( fromX, toX, fromY, toY );
animationScale.setDuration( duration );
animationScale.setFillMode( Animation.FILL_MODE_FORWARDS );
animationScale.setInterpolator( interpolator );
animationScale.setAnimationListener( new Animation.AnimationListener() {
@Override
public void onAnimationStart() {
if ( isDestroyed() ) {
return;
}
if ( listener != null ) {
listener.onAnimStart();
}
}
@Override
public void onAnimationEnd() {
if ( isDestroyed() ) {
return;
}
if ( listener != null ) {
listener.onAnimEnd();
}
}
} );
mMarker.setAnimation( animationScale );
mMarker.startAnimation();
}
@Override
public void startJumpAnimation( float high, long duration, Interpolator interpolator, OnMarkerAnimationListener listener ) {
if ( isDestroyed() || high <= 0.0f || interpolator == null || duration < 0 ) {
return;
}
try {
final LatLng latLng = ObjectUtils.fromMogo2( getPosition() );
Point point = AMapWrapper.getAMap().getProjection().toScreenLocation( latLng );
point.y -= WindowUtils.dip2px( AbsMogoApplication.getApp(), high );
LatLng target = AMapWrapper.getAMap().getProjection().fromScreenLocation( point );
//使用TranslateAnimation,填写一个需要移动的目标点
Animation animation = new TranslateAnimation( target );
animation.setInterpolator( interpolator );
animation.setAnimationListener( new Animation.AnimationListener() {
@Override
public void onAnimationStart() {
if ( isDestroyed() ) {
return;
}
if ( listener != null ) {
listener.onAnimStart();
}
}
@Override
public void onAnimationEnd() {
if ( isDestroyed() ) {
return;
}
if ( listener != null ) {
listener.onAnimEnd();
}
}
} );
//整个移动所需要的时间
animation.setDuration( duration );
//设置动画
mMarker.setAnimation( animation );
mMarker.startAnimation();
} catch ( Exception e ) {
Logger.e( TAG, e, "error." );
}
}
@Override
public void setClickable( boolean clickable ) {
if ( mMarker != null ) {
@@ -349,6 +436,11 @@ public class AMapMarkerWrapper implements IMogoMarker, Observer {
@Override
public void startSmooth(List<MogoLatLng> points,int duration) {
if ( isDestroyed() ) {
return;
}
if (mMarker != null && points.size() > 0){
List<LatLng> p = new ArrayList<>();
for (int i = 0; i < points.size(); i++) {

View File

@@ -20,6 +20,11 @@ android {
}
}
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
}
dependencies {

View File

@@ -6,6 +6,7 @@ import android.graphics.Point;
import android.view.animation.Interpolator;
import com.mogo.map.MogoLatLng;
import com.mogo.map.marker.anim.OnMarkerAnimationListener;
import java.util.ArrayList;
import java.util.List;
@@ -247,6 +248,38 @@ public interface IMogoMarker {
int duration,
Interpolator interpolator );
/**
* 缩放动画
*
* @param fromX
* @param toX
* @param fromY
* @param toY
* @param duration
* @param interpolator
* @param listener
*/
void startScaleAnimation( float fromX,
float toX,
float fromY,
float toY,
int duration,
Interpolator interpolator,
OnMarkerAnimationListener listener );
/**
* 弹跳动画
* @param high
* @param duration
* @param interpolator
* @param listener
*/
void startJumpAnimation( float high,
long duration,
Interpolator interpolator,
OnMarkerAnimationListener listener);
/**
* 是否是否可点击
*
@@ -257,8 +290,8 @@ public interface IMogoMarker {
/**
* 开始平滑移动
*
* @param points 坐标点
* @param duration 时长
* @param points 坐标点
* @param duration 时长
*/
void startSmooth(List<MogoLatLng> points, int duration);
void startSmooth( List< MogoLatLng > points, int duration );
}

View File

@@ -0,0 +1,16 @@
package com.mogo.map.marker.anim;
/**
* @author congtaowang
* @since 2020-04-22
* <p>
* marker 动画监听
*/
public interface OnMarkerAnimationListener {
default void onAnimStart() {
}
default void onAnimEnd() {
}
}

View File

@@ -11,6 +11,7 @@ import androidx.annotation.Nullable;
import com.mogo.map.MogoLatLng;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.anim.OnMarkerAnimationListener;
import java.util.List;
@@ -141,12 +142,15 @@ public interface IMogoMapUIController {
/**
* marker 跳跃动画
* <p>
* Deprecated, instead of by {@link IMogoMarker#startJumpAnimation(float, long, Interpolator, OnMarkerAnimationListener)}
*
* @param marker 跳跃的 marker
* @param high 跳跃的高度
* @param interpolator 插值器
* @param duration 动画时间
*/
@Deprecated
void startJumpAnimation( IMogoMarker marker, float high, Interpolator interpolator,
long duration );

View File

@@ -4,6 +4,7 @@ import android.graphics.BitmapFactory
import android.os.Bundle
import android.text.TextUtils
import android.view.View
import android.view.animation.BounceInterpolator
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.facade.annotation.Route
@@ -11,6 +12,7 @@ import com.mogo.map.MogoLatLng
import com.mogo.map.listener.IMogoMapListener
import com.mogo.map.marker.IMogoMarker
import com.mogo.map.marker.MogoMarkerOptions
import com.mogo.map.marker.anim.OnMarkerAnimationListener
import com.mogo.map.search.geo.IMogoGeoSearchListener
import com.mogo.map.search.geo.MogoGeocodeResult
import com.mogo.map.search.geo.MogoRegeocodeResult
@@ -43,161 +45,152 @@ import kotlinx.android.synthetic.main.fragment_setting_address.tv_set_as_home
* 2020-01-07.
*/
class SettingAddressFragment : BaseFragment(), IMogoGeoSearchListener {
override fun onRegeocodeSearched(regeocodeResult: MogoRegeocodeResult?) {
et_navi_search.setText(regeocodeResult?.regeocodeAddress?.formatAddress)
var formatAddress = regeocodeResult?.regeocodeAddress?.formatAddress
selectPoi?.address = formatAddress
override fun onRegeocodeSearched(regeocodeResult: MogoRegeocodeResult?) {
et_navi_search.setText(regeocodeResult?.regeocodeAddress?.formatAddress)
var formatAddress = regeocodeResult?.regeocodeAddress?.formatAddress
selectPoi?.address = formatAddress
var neighborhood = regeocodeResult?.regeocodeAddress?.neighborhood
if (!TextUtils.isEmpty(neighborhood)) {
selectPoi?.name = neighborhood
} else {
selectPoi?.name = formatAddress
}
}
override fun onGeocodeSearched(geocodeResult: MogoGeocodeResult?) {
}
private val TAG: String = "SettingAddressFragment"
private var style: Int = DataConstants.TYPE_HOME_ADDRESS
var addMarker: IMogoMarker? = null
private var selectPoi: SearchPoi? = null
private var mapListener: IMogoMapListener = object : MogoMapListenerAdapter() {
override fun onMapChanged(
latLng: MogoLatLng?,
zoom: Float,
tilt: Float,
bearing: Float
) {
super.onMapChanged(latLng, zoom, tilt, bearing)
selectPoi = EntityConvertUtils.geoToPoi(latLng?.lat ?: 0.0, latLng?.lng ?: 0.0, style)
var mogoRegeocodeQuery = MogoRegeocodeQuery()
mogoRegeocodeQuery.point = latLng
SearchServiceHolder.getGeoSearcher()
.getFromLocationAsyn(mogoRegeocodeQuery)
addMarker?.apply {
SearchServiceHolder.getMapUIController()
.startJumpAnimation(
this,
150f, { input ->
if (input <= 0.5) {
(0.5f - 2.0 * (0.5 - input) * (0.5 - input)).toFloat()
} else {
(0.5f - Math.sqrt(((input - 0.5f) * (1.5f - input)).toDouble())).toFloat()
}
}, 600
)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
style = arguments?.getInt(AMapConstants.KEY_SET_HOME_COMPONY) ?: DataConstants.TYPE_HOME_ADDRESS
SearchServiceHolder.listenerCenter.registerMogoMapListener(
AMapConstants.PATH_FRAGMENT_SETTING_HOME, mapListener
)
SearchServiceHolder.getMapUIController().showMyLocation(false)
SearchServiceHolder.getGeoSearcher().setGeoSearchListener(this)
SearchServiceHolder.getMarkerManger().removeMarkers()
}
override fun getLayoutId(): Int {
return R.layout.fragment_setting_address
}
fun isHome(): Boolean {
return style == DataConstants.TYPE_HOME_ADDRESS
}
fun isCompony(): Boolean {
return style == DataConstants.TYPE_COMPANY_ADDRESS
}
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?
) {
super.onViewCreated(view, savedInstanceState)
if (isHome()) {
tv_set_as_home.text = resources.getString(R.string.set_as_home_navi)
} else {
tv_set_as_home.text = resources.getString(R.string.set_as_compony_navi)
var neighborhood = regeocodeResult?.regeocodeAddress?.neighborhood
if (!TextUtils.isEmpty(neighborhood)) {
selectPoi?.name = neighborhood
} else {
selectPoi?.name = formatAddress
}
}
iv_navi_back.setOnClickListener {
SearchServiceHolder.fragmentManager.pop()
}
tv_set_as_home.setOnClickListener {
if (selectPoi == null) {
Toast.makeText(context, "请选择", Toast.LENGTH_SHORT)
.show()
return@setOnClickListener
}
insert(selectPoi!!)
SearchServiceHolder.fragmentManager.pop()
override fun onGeocodeSearched(geocodeResult: MogoGeocodeResult?) {
}
et_navi_search.isEnabled = false
et_navi_search.setText(getString(string.drag_map_to_choose))
var location = SearchServiceHolder.getMapUIController().windowCenterLocation
private val TAG: String = "SettingAddressFragment"
private var style: Int = DataConstants.TYPE_HOME_ADDRESS
var addMarker: IMogoMarker? = null
UiThreadHandler.postDelayed({
if (!isAdded) {
return@postDelayed
}
var decodeResource = BitmapFactory.decodeResource(resources, R.mipmap.icon_choose_position2)
val options = MogoMarkerOptions()
.icon(decodeResource)
.latitude(location?.lat ?: 0.0)
.owner(TAG)
.anchor(0.5f, 1f)
.longitude(location?.lng ?: 0.0)
addMarker = SearchServiceHolder.getMarkerManger()
.addMarker(AMapConstants.PATH_FRAGMENT_SETTING_HOME, options)
private var selectPoi: SearchPoi? = null
private var mapListener: IMogoMapListener = object : MogoMapListenerAdapter() {
override fun onMapChanged(
latLng: MogoLatLng?,
zoom: Float,
tilt: Float,
bearing: Float) {
super.onMapChanged(latLng, zoom, tilt, bearing)
selectPoi = EntityConvertUtils.geoToPoi(latLng?.lat ?: 0.0, latLng?.lng ?: 0.0, style)
var mogoRegeocodeQuery = MogoRegeocodeQuery()
mogoRegeocodeQuery.point = latLng
SearchServiceHolder.getGeoSearcher().getFromLocationAsyn(mogoRegeocodeQuery)
addMarker?.startJumpAnimation(
150f,
600,
{ input ->
if (input <= 0.5) {
(0.5f - 2.0 * (0.5 - input) * (0.5 - input)).toFloat()
} else {
(0.5f - Math.sqrt(((input - 0.5f) * (1.5f - input)).toDouble())).toFloat()
}
}, null)
var locationPointInScreen = SearchServiceHolder.getMapUIController().getLocationPointInScreen(location)
addMarker?.setPositionByPixels(locationPointInScreen)
}, 500L)
}
fun insert(searchPoi: SearchPoi) {
AddressManager.insert(searchPoi)
Observable.create(
ObservableOnSubscribe<String> {
AppDataBase.getDatabase(activity)
.poiDao()
.insert(searchPoi)
AddressHelper.notifyAddressChanged(searchPoi.type)
})
.subscribeOn(Schedulers.io())
.subscribe()
}
override fun onDestroyView() {
super.onDestroyView()
SearchServiceHolder.listenerCenter.unregisterMogoMapListener(
AMapConstants.PATH_FRAGMENT_SETTING_HOME
)
addMarker?.destroy()
}
companion object {
fun newInstance(type: Int = DataConstants.TYPE_HOME_ADDRESS): Fragment {
var settingAddressFragment = SettingAddressFragment()
val bundle = Bundle()
bundle.putInt(AMapConstants.KEY_SET_HOME_COMPONY, type)
settingAddressFragment.setArguments(bundle)
return settingAddressFragment
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
style = arguments?.getInt(AMapConstants.KEY_SET_HOME_COMPONY)
?: DataConstants.TYPE_HOME_ADDRESS
SearchServiceHolder.listenerCenter.registerMogoMapListener(AMapConstants.PATH_FRAGMENT_SETTING_HOME, mapListener)
SearchServiceHolder.getMapUIController().showMyLocation(false)
SearchServiceHolder.getGeoSearcher().setGeoSearchListener(this)
SearchServiceHolder.getMarkerManger().removeMarkers()
}
override fun getLayoutId(): Int {
return R.layout.fragment_setting_address
}
fun isHome(): Boolean {
return style == DataConstants.TYPE_HOME_ADDRESS
}
fun isCompony(): Boolean {
return style == DataConstants.TYPE_COMPANY_ADDRESS
}
override fun onViewCreated(
view: View,
savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (isHome()) {
tv_set_as_home.text = resources.getString(R.string.set_as_home_navi)
} else {
tv_set_as_home.text = resources.getString(R.string.set_as_compony_navi)
}
iv_navi_back.setOnClickListener {
SearchServiceHolder.fragmentManager.pop()
}
tv_set_as_home.setOnClickListener {
if (selectPoi == null) {
Toast.makeText(context, "请选择", Toast.LENGTH_SHORT)
.show()
return@setOnClickListener
}
insert(selectPoi!!)
SearchServiceHolder.fragmentManager.pop()
}
et_navi_search.isEnabled = false
et_navi_search.setText(getString(string.drag_map_to_choose))
var location = SearchServiceHolder.getMapUIController().windowCenterLocation
UiThreadHandler.postDelayed({
if (!isAdded) {
return@postDelayed
}
var decodeResource = BitmapFactory.decodeResource(resources, R.mipmap.icon_choose_position2)
val options = MogoMarkerOptions()
.icon(decodeResource)
.latitude(location?.lat ?: 0.0)
.owner(TAG)
.anchor(0.5f, 1f)
.longitude(location?.lng ?: 0.0)
addMarker = SearchServiceHolder.getMarkerManger()
.addMarker(AMapConstants.PATH_FRAGMENT_SETTING_HOME, options)
var locationPointInScreen = SearchServiceHolder.getMapUIController().getLocationPointInScreen(location)
addMarker?.setPositionByPixels(locationPointInScreen)
}, 500L)
}
fun insert(searchPoi: SearchPoi) {
AddressManager.insert(searchPoi)
Observable.create(
ObservableOnSubscribe<String> {
AppDataBase.getDatabase(activity)
.poiDao()
.insert(searchPoi)
AddressHelper.notifyAddressChanged(searchPoi.type)
})
.subscribeOn(Schedulers.io())
.subscribe()
}
override fun onDestroyView() {
super.onDestroyView()
SearchServiceHolder.listenerCenter.unregisterMogoMapListener(
AMapConstants.PATH_FRAGMENT_SETTING_HOME
)
addMarker?.destroy()
}
companion object {
fun newInstance(type: Int = DataConstants.TYPE_HOME_ADDRESS): Fragment {
var settingAddressFragment = SettingAddressFragment()
val bundle = Bundle()
bundle.putInt(AMapConstants.KEY_SET_HOME_COMPONY, type)
settingAddressFragment.setArguments(bundle)
return settingAddressFragment
}
}
}
}