diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/network/SubscribeImpl.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/network/SubscribeImpl.java index 819701d8b4..26a38797cf 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/network/SubscribeImpl.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/network/SubscribeImpl.java @@ -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 ) { diff --git a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java index efdd5da1f2..523591332d 100644 --- a/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java +++ b/libraries/map-amap/src/main/java/com/mogo/map/impl/amap/marker/AMapMarkerWrapper.java @@ -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 points,int duration) { + + if ( isDestroyed() ) { + return; + } + if (mMarker != null && points.size() > 0){ List p = new ArrayList<>(); for (int i = 0; i < points.size(); i++) { diff --git a/libraries/mogo-map-api/build.gradle b/libraries/mogo-map-api/build.gradle index c7637e37ca..cac5399ae1 100644 --- a/libraries/mogo-map-api/build.gradle +++ b/libraries/mogo-map-api/build.gradle @@ -20,6 +20,11 @@ android { } } + compileOptions { + sourceCompatibility 1.8 + targetCompatibility 1.8 + } + } dependencies { diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java index f48e10b104..7cb519b426 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/IMogoMarker.java @@ -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 points, int duration); + void startSmooth( List< MogoLatLng > points, int duration ); } diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/anim/OnMarkerAnimationListener.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/anim/OnMarkerAnimationListener.java new file mode 100644 index 0000000000..436e1f0e68 --- /dev/null +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/marker/anim/OnMarkerAnimationListener.java @@ -0,0 +1,16 @@ +package com.mogo.map.marker.anim; + +/** + * @author congtaowang + * @since 2020-04-22 + *

+ * marker 动画监听 + */ +public interface OnMarkerAnimationListener { + + default void onAnimStart() { + } + + default void onAnimEnd() { + } +} diff --git a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java index e8a557dd79..bc738c6daa 100644 --- a/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java +++ b/libraries/mogo-map-api/src/main/java/com/mogo/map/uicontroller/IMogoMapUIController.java @@ -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 跳跃动画 + *

+ * 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 ); diff --git a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt index 934fb14b82..1419754974 100644 --- a/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt +++ b/modules/mogo-module-search/src/main/java/com/mogo/module/navi/ui/setting/SettingAddressFragment.kt @@ -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 { - 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 { + 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 + } } - } }