寻宝poi界面展示

This commit is contained in:
wds
2021-06-08 10:32:57 +08:00
parent 65bf9a68f2
commit e9e0c175f3
18 changed files with 887 additions and 369 deletions

View File

@@ -21,6 +21,7 @@ import com.navinfo.outdoor.fragment.MineFragment;
import com.navinfo.outdoor.fragment.PoiFragment;
import com.navinfo.outdoor.fragment.PrivilegeFragment;
import com.navinfo.outdoor.fragment.RecordFragment;
import com.navinfo.outdoor.fragment.RoadFragment;
import com.navinfo.outdoor.fragment.SetFragment;
import com.navinfo.outdoor.fragment.TaskExWebFragment;
import com.navinfo.outdoor.fragment.TaskExplainFragment;
@@ -30,7 +31,6 @@ import com.navinfo.outdoor.fragment.TaskPrefectureFragment;
import com.navinfo.outdoor.fragment.RegisterFragment;
import com.navinfo.outdoor.fragment.TreasureFragment;
import com.navinfo.outdoor.fragment.UserAttestationFragment;
import com.navinfo.outdoor.fragment.RoadFragment;
import com.navinfo.outdoor.fragment.WithdrawFragment;
import com.gyf.immersionbar.ImmersionBar;
import com.navinfo.outdoor.fragment.WithdrawalRecordFragment;

View File

@@ -176,6 +176,7 @@ public class UserActivity extends BaseActivity implements View.OnClickListener {
Toast.makeText(UserActivity.this, region_id, Toast.LENGTH_SHORT).show();
String tx = opt1tx + " " + opt2tx + " " + opt3tx;
region.setText(tx);
}
}).setSubmitText("确定")//确定按钮文字
.setCancelText("取消")//取消按钮文字
@@ -242,10 +243,12 @@ public class UserActivity extends BaseActivity implements View.OnClickListener {
Province_AreaList.add(City_AreaList);//添加该省所有地区数据
city_AreaList.add(AreaList);//添加该省所有地区数据的bean
}
/**
* 添加城市数据
*/
options2Items.add(CityList);
/**
* 添加地区数据
*/

View File

@@ -1,64 +1,108 @@
package com.navinfo.outdoor.fragment;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import com.navinfo.outdoor.R;
import com.navinfo.outdoor.base.BaseFragment;
import com.tencent.tencentmap.mapsdk.maps.MapView;
import com.tencent.tencentmap.mapsdk.maps.TencentMap;
import static android.app.Activity.RESULT_OK;
/**
* 寻宝-点击上传弹窗点击poi
* 记录的Fragment
* 2021-5-25
*/
public class PoiFragment extends Fragment {
public class PoiFragment extends BaseFragment implements View.OnClickListener {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private EditText editDescribe;
private ImageView imagePanorama;
private ImageView imageName;
private ImageView imageInternalPhotos;
private ImageView imageCard;
private ImageView imageElse;
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public PoiFragment() {
// Required empty public constructor
@Override
protected int getLayout() {
return R.layout.poi_fragment;
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment PoiFragment.
*/
// TODO: Rename and change types and number of parameters
public static PoiFragment newInstance(String param1, String param2) {
PoiFragment fragment = new PoiFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
@Override
protected void initView() {
super.initView();
editDescribe = findViewById(R.id.edit_describe);
imagePanorama = findViewById(R.id.image_panorama);
imagePanorama.setOnClickListener(this::onClick);
imageName = findViewById(R.id.image_name);
imageName.setOnClickListener(this::onClick);
imageInternalPhotos = findViewById(R.id.image_internal_photos);
imageInternalPhotos.setOnClickListener(this::onClick);
imageCard = findViewById(R.id.image_card);
imageCard.setOnClickListener(this::onClick);
imageElse = findViewById(R.id.image_else);
imageElse.setOnClickListener(this::onClick);
}
@Override
protected void initData() {
super.initData();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
public void onClick(View v) {
switch (v.getId()){
case R.id.image_panorama:
Intent intentPanorama = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intentPanorama, 101);
break;
case R.id.image_name:
Intent intentName = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intentName, 102);
break;
case R.id.image_internal_photos:
Intent intentInternal = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intentInternal, 103);
break;
case R.id.image_card:
Intent intentCard = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intentCard, 104);
break;
case R.id.image_else:
Intent intentElse = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intentElse, 105);
break;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_poi, container, false);
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 101 && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();//从Intent中获取附加值
Bitmap bitmap = (Bitmap) extras.get("data");//从附加值中获取返回的图像
imagePanorama.setImageBitmap(bitmap);//显示图像
} else if (requestCode == 102 && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();//从Intent中获取附加值
Bitmap bitmap = (Bitmap) extras.get("data");//从附加值中获取返回的图像
imageName.setImageBitmap(bitmap);//显示图像
}else if (requestCode == 103 && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();//从Intent中获取附加值
Bitmap bitmap = (Bitmap) extras.get("data");//从附加值中获取返回的图像
imageInternalPhotos.setImageBitmap(bitmap);//显示图像
}else if (requestCode == 104 && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();//从Intent中获取附加值
Bitmap bitmap = (Bitmap) extras.get("data");//从附加值中获取返回的图像
imageCard.setImageBitmap(bitmap);//显示图像
}else if (requestCode == 105 && resultCode == RESULT_OK) {
Bundle extras = data.getExtras();//从Intent中获取附加值
Bitmap bitmap = (Bitmap) extras.get("data");//从附加值中获取返回的图像
imageElse.setImageBitmap(bitmap);//显示图像
}
}
}

View File

@@ -16,12 +16,16 @@ import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentManager;
import com.kongzue.dialog.util.DialogSettings;
import com.kongzue.dialog.v3.ShareDialog;
import com.navinfo.outdoor.R;
import com.navinfo.outdoor.activity.FragmentManagement;
import com.navinfo.outdoor.api.Constant;
@@ -44,6 +48,9 @@ import com.tencent.tencentmap.mapsdk.maps.model.CameraPosition;
import com.tencent.tencentmap.mapsdk.maps.model.LatLng;
import com.tencent.tencentmap.mapsdk.maps.model.MyLocationStyle;
import java.util.ArrayList;
import java.util.List;
import static com.lzy.okgo.utils.HttpUtils.runOnUiThread;
/**
@@ -61,6 +68,7 @@ public class TreasureFragment extends BaseFragment implements View.OnClickListen
private MyLocationStyle locationStyle;
private OnLocationChangedListener locationChangedListener;
private ImageView ivLocation;
private ImageView ivSubmit;
private ImageView ivRefish;
@Override
@@ -73,6 +81,8 @@ public class TreasureFragment extends BaseFragment implements View.OnClickListen
super.initView();
ivRefish = findViewById(R.id.iv_refrish);
ivRefish.setOnClickListener(this::onClick);
ivSubmit = findViewById(R.id.iv_submit);
ivSubmit.setOnClickListener(this::onClick);
treasureMap = (MapView) findViewById(R.id.treasure_map);
tencentMap = treasureMap.getMap();
cbMapType = (CheckBox) findViewById(R.id.cb_map_type);
@@ -207,19 +217,53 @@ public class TreasureFragment extends BaseFragment implements View.OnClickListen
tencentMap.animateCamera(cameraUpdateOut);
break;
case R.id.iv_location://定位:
Constant.currentLocation.getLongitude();
CameraUpdate cameraSigma =
CameraUpdateFactory.newCameraPosition(new CameraPosition(
new LatLng(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude()), //中心点坐标,地图目标经纬度
19, //目标缩放级别
0, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
0)); //目标旋转角 0~360° (正北方为0)
tencentMap.animateCamera(cameraSigma);
if (Constant.currentLocation!=null){
Constant.currentLocation.getLongitude();
CameraUpdate cameraSigma =
CameraUpdateFactory.newCameraPosition(new CameraPosition(
new LatLng(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude()), //中心点坐标,地图目标经纬度
19, //目标缩放级别
0, //目标倾斜角[0.0 ~ 45.0] (垂直地图时为0)
0)); //目标旋转角 0~360° (正北方为0)
tencentMap.animateCamera(cameraSigma);
}else {
Toast.makeText(getActivity(), "无定位", Toast.LENGTH_SHORT).show();
checkNetWork();
}
break;
case R.id.iv_refrish://
Intent road = new Intent(getActivity(), FragmentManagement.class);
road.putExtra("tag",28);
startActivity(road);
case R.id.iv_submit://弹窗
//分享
CharSequence title = "请选择上报类型";
List<ShareDialog.Item> itemList = new ArrayList<>();
itemList.add(new ShareDialog.Item(getContext(), R.drawable.push_poi, "POI"));
itemList.add(new ShareDialog.Item(getContext(), R.drawable.push_road, "道路"));
itemList.add(new ShareDialog.Item(getContext(), R.drawable.push_chongdianzhuang, "充电站"));
itemList.add(new ShareDialog.Item(getContext(), R.drawable.push_qingbao, "其他"));
ShareDialog.show((AppCompatActivity) getActivity(), itemList, new ShareDialog.OnItemClickListener() {
@Override
public boolean onClick(ShareDialog shareDialog, int index, ShareDialog.Item item) {
switch (index){
case 0:
Intent poiIntent = new Intent(getActivity(), FragmentManagement.class);
poiIntent.putExtra("tag",27);
startActivity(poiIntent);
break;
case 1:
Intent roadIntent = new Intent(getActivity(), FragmentManagement.class);
roadIntent.putExtra("tag",28);
startActivity(roadIntent);
break;
case 2:
case 3:
Toast.makeText(getContext(), item.getText(), Toast.LENGTH_SHORT).show();
break;
}
return false;
}
}).setTitle(title);
break;
case R.id.iv_refrish:
break;
}
}
@@ -257,7 +301,7 @@ public class TreasureFragment extends BaseFragment implements View.OnClickListen
requestPermissions(permission, 0);
} else {
// 此处为某些5.0动态权限的手机
//goSystemLocationActivity(); // TODO =======待删除======
// goSystemLocationActivity(); // TODO =======待删除======
tipPermissionAlertDialog();
}
}

View File

@@ -0,0 +1,258 @@
package com.navinfo.outdoor.util;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;
/**
* 注意使用的时候需要放大的view,一般是第一个RelativeLayout或者LinearLayout。要加上 android:layout_gravity="center_horizontal"
*/
public class BounceZoomScrollView extends ScrollView {
private static final String TAG = "BounceScrollView";
//----头部收缩属性--------
// 记录首次按下位置
private float mFirstPosition = 0;
// 头部图片是否正在放大
private Boolean mScaling = false;
private View dropZoomView;//需要被放大的view
private int dropZoomViewWidth;
private int dropZoomViewHeight;
//----头部收缩属性end--------
//------尾部收缩属性--------
private View inner;// 子View
private float y;// 点击时y坐标
private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.)
private boolean isCount = false;// 是否开始计算
//最后的坐标
private float lastX = 0;
private float lastY = 0;
//当前坐标
private float currentX = 0;
private float currentY = 0;
//移动的坐标量
private float distanceX = 0;
private float distanceY = 0;
private boolean upDownSlide = false; //判断上下滑动的flag
//------尾部收缩属性end--------
public BounceZoomScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
//初始化
private void init() {
setOverScrollMode(OVER_SCROLL_NEVER);
if (getChildAt(0) != null) {
inner = getChildAt(0);//这个是底部收缩的view
//头部收缩的
ViewGroup vg = (ViewGroup) getChildAt(0);
if (vg.getChildAt(0) != null) {
dropZoomView = vg.getChildAt(0);
}
}
}
/***
* 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate
* 方法,也应该调用父类的方法,使该方法得以执行.
*/
@Override
protected void onFinishInflate() {
//初始化
init();
super.onFinishInflate();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//这里只是计算尾部坐标
currentX = ev.getX();
currentY = ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
distanceX = currentX - lastX;
distanceY = currentY - lastY;
if (Math.abs(distanceX) < Math.abs(distanceY) && Math.abs(distanceY) > 12) {
upDownSlide = true;
}
break;
}
lastX = currentX;
lastY = currentY;
if (upDownSlide && inner != null) commOnTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
/***
* 触摸事件
*
* @param ev
*/
public void commOnTouchEvent(MotionEvent ev) {
//头部缩放计算
if (dropZoomViewWidth <= 0 || dropZoomViewHeight <= 0) {
dropZoomViewWidth = dropZoomView.getMeasuredWidth();
dropZoomViewHeight = dropZoomView.getMeasuredHeight();
}
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
//手指离开后头部恢复图片
mScaling = false;
replyImage();
// 手指松开尾部恢复
if (isNeedAnimation()) {
animation();
isCount = false;
}
clear0();
break;
//这里头尾分开处理,互不干扰
case MotionEvent.ACTION_MOVE:
//尾部处理
final float preY = y;// 按下时的y坐标
float nowY = ev.getY();// 时时y坐标
int deltaY = (int) (preY - nowY);// 滑动距离
if (!isCount) {
deltaY = 0; // 在这里要归0.
}
y = nowY;
// 当滚动到最上或者最下时就不会再滚动,这时移动布局
if (isNeedMove()) {
// 初始化头部矩形
if (normal.isEmpty()) {
// 保存正常的布局位置
normal.set(inner.getLeft(), inner.getTop(),
inner.getRight(), inner.getBottom());
}
// 移动布局
inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,
inner.getRight(), inner.getBottom() - deltaY / 2);
}
isCount = true;
//尾部处理end
//头部处理
if (!mScaling) {
if (getScrollY() == 0) {
mFirstPosition = ev.getY();// 滚动到顶部时记录位置,否则正常返回
} else {
break;
}
}
int distance = (int) ((ev.getY() - mFirstPosition) * 0.6); // 滚动距离乘以一个系数
if (distance < 0) { // 当前位置比记录位置要小,正常返回
break;
}
// 处理放大
mScaling = true;
setZoom(1 + distance);
//头部处理end
break;
}
}
/***
* 回缩动画,尾部往下缩动画
*/
public void animation() {
// 开启移动动画
TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),
normal.top);
ta.setDuration(200);
inner.startAnimation(ta);
// 设置回到正常的布局位置
inner.layout(normal.left, normal.top, normal.right, normal.bottom);
normal.setEmpty();
}
// 是否需要开启动画
public boolean isNeedAnimation() {
return !normal.isEmpty();
}
// 回弹动画header往上缩动画 (使用了属性动画)
public void replyImage() {
final float distance = dropZoomView.getMeasuredWidth() - dropZoomViewWidth;
// 设置动画
ValueAnimator anim = ObjectAnimator.ofFloat(0.0F, 1.0F).setDuration((long) (distance * 0.7));
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float cVal = (Float) animation.getAnimatedValue();
setZoom(distance - ((distance) * cVal));
}
});
anim.start();
}
//头部缩放
public void setZoom(float s) {
if (dropZoomViewHeight <= 0 || dropZoomViewWidth <= 0) {
return;
}
ViewGroup.LayoutParams lp = dropZoomView.getLayoutParams();
lp.width = (int) (dropZoomViewWidth + s);
lp.height = (int) (dropZoomViewHeight * ((dropZoomViewWidth + s) / dropZoomViewWidth));
dropZoomView.setLayoutParams(lp);
}
/***
* 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度
*
* getHeight():获取的是屏幕的高度
*
* @return
*/
public boolean isNeedMove() {
int offset = inner.getMeasuredHeight() - getHeight();
int scrollY = getScrollY();
// 0是顶部后面那个是底部
if (scrollY == 0 || scrollY == offset) {
return true;
}
return false;
}
//清理尾部属性值
private void clear0() {
lastX = 0;
lastY = 0;
distanceX = 0;
distanceY = 0;
upDownSlide = false;
}
}