利用百度地图Android sdk高仿微信发送位置功能及遇到的问题

接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶

我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出

1、在微信发送功能中,不管用户如何拖拽地图,总有个覆盖物固定了MapView中央,怎么实现?

其实这很容易实现,只要MapView的布局文件中,将一个ImageView覆盖在MapView的中央,就能够实现不管用户如何拖拽地图,覆盖物(ImageView)总固定总MapView中央

2、如何获取MapView中央的地理坐标,也即是屏幕覆盖物处的坐标?

要获取MapView中央的地理坐标,首先先获取覆盖物在屏幕上的物理坐标,这里得区别一下地理坐标(经纬度)和物理坐标(xy轴);

可以通过

<mCenterPoint = mBaiduMap.getMapStatus().targetScreen;//mBaiduMap是BaiduMap类的实例 

来获取物理坐标,这个物理坐标是不变的,而物理坐标对应的地理坐标却是随着用户拖拽地图而改变,所以,当我们需要地理坐标时,可以通过

currentLatLng = mBaiduMap.getProjection().fromScreenLocation(
      mCenterPoint);</strong></span> 

获取。

3、如何获取该地理坐标周围的所有poi信息(也就是周围建筑物的信息),而不只是某个类型的兴趣点?

为了实现这个功能,真是费了我好大劲,因为我之前一直以为用POI周边搜索实现的,有人提示我可以通过循环轴线搜索实现不同关键字搜索,但这样子确实很难实现跟微信那样的效果。通过查看API,发现可以通过反地理编码解决这个问题,至于什么事反地理编码,可以到百度地图官网了解,通过调用它,可以返回一个该地理坐标附近建筑信息的一个列表

4、当用户拖拽地图,如何让列表更新到目前中心地理位置的周边信息?

这个困难其实也不难实现,只是重写mBaiduMap.setOnMapTouchListener(touchListener);触摸事件,在触摸监听器的回调函数中

将MapView中央的物理坐标转换成对应的地理坐标,再通过反地理编码获取周边信息,道理同问题3

5、当点击listview某一项时,如何将项地理位置显示在MapView也就是屏幕中央?

很简单,通过listview的适配器获取item的位置信息,包括经纬度,然后用动画跳转到屏幕中央位置即可。

我认为上面5个问题是实现这个功能的关键所在,下面是效果图

上面是一个MapVIew,覆盖物固定在其中央,地图左下角的白色正方形是回到定位点的按钮,因为没找到好看的图片,就留着空白了

下面是一个listView,显示地图指示地点周围的一些位置信息

贴一下实现该功能的核心代码

Activity类

package com.vr.souhuodong.UI.Sou;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Point;
import android.net.Uri;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapTouchListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.vr.souhuodong.R;
import com.vr.souhuodong.UI.Adapter.PlaceListAdapter;
public class ChoosePlaceActivity extends Activity {
 MapView mMapView;
 BaiduMap mBaiduMap;
 ProgressBar mLoadBar;
 ImageView mSelectImg;
 // 定位
 LocationClient mLocationClient = null;
 MyBDLocationListner mListner = null;
 BitmapDescriptor mCurrentMarker = null;
 // 当前经纬度
 double mLantitude;
 double mLongtitude;
 LatLng mLoactionLatLng;
 // 设置第一次定位标志
 boolean isFirstLoc = true;
 // MapView中央对于的屏幕坐标
 Point mCenterPoint = null;
 // 地理编码
 GeoCoder mGeoCoder = null;
 // 位置列表
 ListView mListView;
 PlaceListAdapter mAdapter;
 List<PoiInfo> mInfoList;
 PoiInfo mCurentInfo;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  // TODO Auto-generated method stub
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_chooseplace);
  initView();
 }
 /**
  * 初始化界面
  */
 private void initView() {
  // TODO Auto-generated method stub
  // 初始化地图
  mMapView = (MapView) findViewById(R.id.chooseplace_bmapView);
  mMapView.showZoomControls(false);
  mBaiduMap = mMapView.getMap();
  MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(17.0f);
  mBaiduMap.setMapStatus(msu);
  mBaiduMap.setOnMapTouchListener(touchListener);
  // 初始化POI信息列表
  mInfoList = new ArrayList<PoiInfo>();
  // 初始化当前MapView中心屏幕坐标,初始化当前地理坐标
  mCenterPoint = mBaiduMap.getMapStatus().targetScreen;
  mLoactionLatLng = mBaiduMap.getMapStatus().target;
  // 定位
  mBaiduMap.setMyLocationEnabled(true);
  mLocationClient = new LocationClient(this);
  mListner = new MyBDLocationListner();
  mLocationClient.registerLocationListener(mListner);
  LocationClientOption option = new LocationClientOption();
  option.setOpenGps(true);// 打开gps
  option.setCoorType("bd09ll"); // 设置坐标类型
  option.setScanSpan(1000);
  mLocationClient.setLocOption(option);
  mLocationClient.start();
  // 地理编码
  mGeoCoder = GeoCoder.newInstance();
  mGeoCoder.setOnGetGeoCodeResultListener(GeoListener);
  // 周边位置列表
  mListView = (ListView) findViewById(R.id.place_list);
  mLoadBar = (ProgressBar) findViewById(R.id.place_progressBar);
  mListView.setOnItemClickListener(itemClickListener);
  mAdapter = new PlaceListAdapter(getLayoutInflater(), mInfoList);
  mListView.setAdapter(mAdapter);
  mSelectImg = new ImageView(this);
 }
 public void turnBack(View view) {
  // 实现动画跳转
  MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(mLoactionLatLng);
  mBaiduMap.animateMapStatus(u);
  mBaiduMap.clear();
  // 发起反地理编码检索
  mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())
    .location(mLoactionLatLng));
 }
 @Override
 protected void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  mLocationClient.stop();
  mGeoCoder.destroy();
 }
 // 定位监听器
 private class MyBDLocationListner implements BDLocationListener {
  @Override
  public void onReceiveLocation(BDLocation location) {
   // TODO Auto-generated method stub
   // map view 销毁后不在处理新接收的位置
   if (location == null || mMapView == null)
    return;
   MyLocationData data = new MyLocationData.Builder()//
     // .direction(mCurrentX)//
     .accuracy(location.getRadius())//
     .latitude(location.getLatitude())//
     .longitude(location.getLongitude())//
     .build();
   mBaiduMap.setMyLocationData(data);
   // 设置自定义图标
   MyLocationConfiguration config = new MyLocationConfiguration(
     LocationMode.NORMAL, true, null);
   mBaiduMap.setMyLocationConfigeration(config);
   mLantitude = location.getLatitude();
   mLongtitude = location.getLongitude();
   LatLng currentLatLng = new LatLng(mLantitude, mLongtitude);
   mLoactionLatLng = new LatLng(mLantitude, mLongtitude);
   // 是否第一次定位
   if (isFirstLoc) {
    isFirstLoc = false;
    // 实现动画跳转
    MapStatusUpdate u = MapStatusUpdateFactory
      .newLatLng(currentLatLng);
    mBaiduMap.animateMapStatus(u);
    mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())
      .location(currentLatLng));
    return;
   }
  }
 }
 // 地理编码监听器
 OnGetGeoCoderResultListener GeoListener = new OnGetGeoCoderResultListener() {
  public void onGetGeoCodeResult(GeoCodeResult result) {
   if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
    // 没有检索到结果
   }
   // 获取地理编码结果
  }
  @Override
  public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
   if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
    // 没有找到检索结果
   }
   // 获取反向地理编码结果
   else {
    // 当前位置信息
    mCurentInfo = new PoiInfo();
    mCurentInfo.address = result.getAddress();
    mCurentInfo.location = result.getLocation();
    mCurentInfo.name = "[位置]";
    mInfoList.clear();
    mInfoList.add(mCurentInfo);
    // 将周边信息加入表
    if (result.getPoiList() != null) {
     mInfoList.addAll(result.getPoiList());
    }
    // 通知适配数据已改变
    mAdapter.notifyDataSetChanged();
    mLoadBar.setVisibility(View.GONE);
   }
  }
 };
 // 地图触摸事件监听器
 OnMapTouchListener touchListener = new OnMapTouchListener() {
  @Override
  public void onTouch(MotionEvent event) {
   // TODO Auto-generated method stub
   if (event.getAction() == MotionEvent.ACTION_UP) {
    if (mCenterPoint == null) {
     return;
    }
    // 获取当前MapView中心屏幕坐标对应的地理坐标
    LatLng currentLatLng;
    currentLatLng = mBaiduMap.getProjection().fromScreenLocation(
      mCenterPoint);
    System.out.println("----" + mCenterPoint.x);
    System.out.println("----" + currentLatLng.latitude);
    // 发起反地理编码检索
    mGeoCoder.reverseGeoCode((new ReverseGeoCodeOption())
      .location(currentLatLng));
    mLoadBar.setVisibility(View.VISIBLE);
   }
  }
 };
 // listView选项点击事件监听器
 OnItemClickListener itemClickListener = new OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position,
    long id) {
   // TODO Auto-generated method stub
   // 通知是适配器第position个item被选择了
   mAdapter.setNotifyTip(position);
   BitmapDescriptor mSelectIco = BitmapDescriptorFactory
     .fromResource(R.drawable.icon_geo);
   mBaiduMap.clear();
   PoiInfo info = (PoiInfo) mAdapter.getItem(position);
   LatLng la = info.location;
   // 动画跳转
   MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(la);
   mBaiduMap.animateMapStatus(u);
   // 添加覆盖物
   OverlayOptions ooA = new MarkerOptions().position(la)
     .icon(mSelectIco).anchor(0.5f, 0.5f);
   mBaiduMap.addOverlay(ooA);
   // 选中项打勾
   mSelectImg.setBackgroundResource(R.drawable.greywhite);
   mSelectImg = (ImageView) view.findViewById(R.id.place_select);
   mSelectImg.setBackgroundResource(R.drawable.ic_select);
//   Uri mUri = Uri.parse("geo:39.940409,116.355257");
//   Intent mIntent = new Intent(Intent.ACTION_VIEW,mUri);
//   startActivity(mIntent);
  }
 };
} 

自定义的listView适配器

package com.vr.souhuodong.UI.Adapter;
import java.util.List;
import android.R.integer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.baidu.mapapi.search.core.PoiInfo;
import com.vr.souhuodong.R;
public class PlaceListAdapter extends BaseAdapter {
 List<PoiInfo> mList;
 LayoutInflater mInflater;
 int notifyTip ;
 private class MyViewHolder {
  TextView placeName;
  TextView placeAddree;
  ImageView placeSelected;
 }
 public PlaceListAdapter(LayoutInflater mInflater , List<PoiInfo> mList) {
  super();
  this.mList = mList;
  this.mInflater = mInflater;
  notifyTip = -1 ;
 }
 /**
  * 设置第几个item被选择
  * @param notifyTip
  */
 public void setNotifyTip(int notifyTip) {
  this.notifyTip = notifyTip;
 }
 @Override
 public int getCount() {
  // TODO Auto-generated method stub
  return mList.size();
 }
 @Override
 public Object getItem(int position) {
  // TODO Auto-generated method stub
  return mList.get(position);
 }
 @Override
 public long getItemId(int position) {
  // TODO Auto-generated method stub
  return position;
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  // TODO Auto-generated method stub
  MyViewHolder holder;
  if (convertView == null) {
   System.out.println("----aa-");
   convertView = mInflater.inflate(com.vr.souhuodong.R.layout.listitem_place, parent, false);
   holder = new MyViewHolder();
   holder.placeName = (TextView) convertView
     .findViewById(com.vr.souhuodong.R.id.place_name);
   holder.placeAddree = (TextView) convertView
     .findViewById(com.vr.souhuodong.R.id.place_adress);
   holder.placeSelected = (ImageView) convertView
     .findViewById(com.vr.souhuodong.R.id.place_select);
   holder.placeName.setText(mList.get(position).name);
   holder.placeAddree.setText(mList.get(position).address);
   holder.placeSelected.setBackgroundResource(R.drawable.greywhite);
   convertView.setTag(holder);
  } else {
   holder = (MyViewHolder) convertView.getTag();
  }
  holder.placeName.setText(mList.get(position).name);
  holder.placeAddree.setText(mList.get(position).address);
  //根据重新加载的时候第position条item是否是当前所选择的,选择加载不同的图片
  if(notifyTip == position ){
   holder.placeSelected.setBackgroundResource(R.drawable.ic_select);
  }
  else {
   holder.placeSelected.setBackgroundResource(R.drawable.greywhite);
  }
  return convertView;
 }
// class MyItemClickListener implements OnClickListener {
//
//  ImageView mImg;
//  public MyItemClickListener(ImageView mImg) {
//   this.mImg = mImg;
//  }
//  @Override
//  public void onClick(View v) {
//   // TODO Auto-generated method stub
//   mImg.setBackgroundResource(R.drawable.ic_select);
//  }
//
// }
} 

总结

以上所述是小编给大家介绍的利用百度地图Android sdk高仿微信发送位置功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • 用Eclipse搭建Android开发环境并创建第一个Android项目(eclipse+android sdk)
  • Android在线更新SDK的方法(使用国内镜像)
  • Android SDK Manager国内无法更新的解决方案
  • Android 第三方登录、分享(ShareSDK、友盟)
  • android-使用环信SDK开发即时通信功能(附源码下载)
  • Linux系统下安装android sdk的方法步骤
  • Android之高德地图定位SDK集成及地图功能实现
  • Android高德地图poi检索仿微信发送位置实例代码
(0)

相关推荐

  • Android高德地图poi检索仿微信发送位置实例代码

    最近项目需求把发送定位模块改成类似微信发送位置给好友的效果,我使用了高德地图实现了一个demo,效果图如下: 从主界面中我们可以看到中心标记上面显示的就是我们定位的地址,下面是一个listview列表,第一条item的数据就是我们定位得到的地址,下面其余的都是我们根据定位得到的经纬度通过poi周边搜索得到的地址.我们进行了如下操作: 我们点击列表的item,中心标记会移动到该item对象的地址上面去. 我们手动移动地图的时候,中心标记的地址会发生相应的变化并且下面的列表也会发生相应的变化. 根据

  • Android 第三方登录、分享(ShareSDK、友盟)

    为下边的项目做准备,写一个第三方登录.分享的demo.分别使用sharesdk和友盟来实现. 先说一下我对两者的使用上的感觉,个人感觉sharesdk比友盟更好一点,好在哪里呢?好在人工服务上.在集成的过程中遇到了各种问题,但是sharesdk的人工服务做的很好,能给答疑解惑,提供解决问题的方法! 接下来上代码(本文使用android studio开发,sharesdk版本v2.7.7,友盟版本v6.0.0): 一.使用sharesdk(sharesdk版本v2.7.7)来集成: 1.要去官网:

  • android-使用环信SDK开发即时通信功能(附源码下载)

    最近项目中集成即时聊天功能,挑来拣去,最终选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁,说明文档清晰易懂.文档有Android.iOS.和后台服务器端,还是非常全的. 环信官网:http://www.easemob.com/ 本篇文章目的主要在于说明环信Demo如何实现即时通信的.我在集成环信SDK到我们自己开发的app之前,研究了一下环信demo的代码,看了两三天的样子,基本搞清楚来龙去脉,但是只是清楚来龙去脉,要说到里面的细节可能得深一步研究,但是这就够了,已经可以把demo

  • Android之高德地图定位SDK集成及地图功能实现

    一:百度高德官方网站,然后去创建应用 网址:http://lbs.amap.com/ 1.找到控制台创建一个应用 2.添加key名称,注意命名规范,还有就是下面的SHA1和包名 3.点击右边的Gradle再选择signingReport下面会有个命令,稍等几分钟得到SHA1 4.添加包名 5.得到key 二:下载定位SDK,下载下来有地图SDK和定位SDK,然后导入项目,导入再Add As Library,so文件按自己需求来 下载地址:http://lbs.amap.com/api/andro

  • Android在线更新SDK的方法(使用国内镜像)

    本文讲述了Android使用国内镜像在线更新SDK的方法.分享给大家供大家参考,具体如下: 什么是Android SDK: SDK:(software development kit)软件开发工具包.被软件开发工程师用于为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件的开发工具的集合.而 Android SDK 就是 Android 专属的软件开发工具包. 加速下载的方法: 由于 Google 服务器在中国大陆无法正常访问,Android SDK 无法正常更新,给安卓开发者带来诸多不便

  • Android SDK Manager国内无法更新的解决方案

    现在由于GWF,google基本和咱们说咱见了,就给现在在做Android  或者想学习Android 的朋友带来了诸多的不便,最简单的就是Android SDK Manager 你无法更新了. 现在这里有一个解决方案,如下. 1.启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - Settings』窗口: 2.在『Android SDK Manager - Settings』窗口中,在「

  • Linux系统下安装android sdk的方法步骤

    本文阐述的是如何在Linux系统中安装Android SDK 环境,下面话不多说,来看看详细的介绍吧. 直接下载解压: wget http://dl.google.com/android/android-sdk_r22.0.5-linux.tgz 修改对应的版本号即可. 关于后续的sdk更新,可以使用命令行版本的sdkmanager 直接更新到最新的sdk: tools/android update sdk --no-ui 显示所有的sdk版本 android list sdk --all 会得

  • 用Eclipse搭建Android开发环境并创建第一个Android项目(eclipse+android sdk)

    一.搭建Android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 1.安装和配置JAVA开发环境:  ①把准备好的Eclipse和JDK安装到本机上(最好安装在全英文路径下),并给JDK配置环境变量,其中JDK的变量值为JDK安装路径的根目录,如我的为:D:\Program Files\Java\jdk1.7.0_02: ②打开命令提示符(cmd),输入java -version命令,显示如下图则说明JAVA环境变量已经配置好了. 2.安装ADT插件: ①

  • 利用百度地图Android sdk高仿微信发送位置功能及遇到的问题

    接触了百度地图开发平台半个月了,这2天试着模仿了微信给好友发送位置功能,对百度地图的操作能力又上了一个台阶 我在实现这个功能的时候,遇到一些困难,可能也是别人将会遇到的困难,特在此列出 1.在微信发送功能中,不管用户如何拖拽地图,总有个覆盖物固定了MapView中央,怎么实现? 其实这很容易实现,只要MapView的布局文件中,将一个ImageView覆盖在MapView的中央,就能够实现不管用户如何拖拽地图,覆盖物(ImageView)总固定总MapView中央 2.如何获取MapView中央

  • Android基于高德地图poi的仿微信获取位置功能实例代码

    1.打开页面自动定位,同时搜索周边所有poi 2.点击搜索按钮,输入关键子,获取关键字搜索结果 3.选取listview中的一项即可定位到该位置,或者获取任何消息 4.文件类 1.MapActivity public class MapActivity extends Activity implements PoiSearch.OnPoiSearchListener { private MapView mMapView = null; private AMap aMap; private MyL

  • iOS高仿微信表情输入功能代码分享

    最近项目需求,要实现一个类似微信的的表情输入,于是把微信的表情扒拉出来,实现了一把.可以从这里下载源码.看起来表情输入没有多少东西,不外乎就是用NSTextAttachment来实现图文混排,结果在实现的过程中遇到了很多小问题,接下来会一一介绍遇到过的坑.先上一张效果图: 一.实现表情选择View(WKExpressionView) 具体的实现就不细说了,主要功能就是点击表情时,将对应表情的图片名称通知给delegate. 二.实现表情textView(WKExpressionTextView)

  • Android高仿微信表情输入与键盘输入详解

    最近公司在项目上要使用到表情与键盘的切换输入,自己实现了一个,还是存在些缺陷,比如说键盘与表情切换时出现跳闪问题,这个相当困扰我,不过所幸在Github(其中一个不错的开源项目,其代码整体结构很不错)并且在论坛上找些解决方案,再加上我也是研究了好多个开源项目的代码,最后才苦逼地整合出比较不错的实现效果,可以说跟微信基本一样(嘿嘿,只能说目前还没发现大Bug,若发现大家一起日后慢慢完善,这里我也只是给出了实现方案,拓展其他表情我并没有实现哈,不过代码中我实现了一个可拓展的fragment模板以便大

  • Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)

    目前的应用市场上,使用毛玻璃效果的APP随处可见,比如用过微信语音聊天的人可以发现,语音聊天页面就使用了高斯模糊效果. 先看下效果图: 仔细观察上图,我们可以发现,背景图以用户头像为模板,对其进行了高斯模糊,并把它作为整个页面的背景色. 关于Android如何快速实现高斯模糊(毛玻璃效果),网上一堆相关介绍,可参考下面文章一种快速毛玻璃虚化效果实现–Android. 下面直接给出模糊化工具类(已验证可行): import android.graphics.Bitmap; /** * 快速模糊化工

  • Android高仿微信聊天界面代码分享

    微信聊天现在非常火,是因其界面漂亮吗,哈哈,也许吧.微信每条消息都带有一个气泡,非常迷人,看起来感觉实现起来非常难,其实并不难.下面小编给大家分享实现代码. 先给大家展示下实现效果图: OK,下面我们来看一下整个小项目的主体结构: 下面是Activity的代码: package com.way.demo; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import jav

  • Android 高仿微信支付数字键盘功能

    现在很多app的支付.输入密码功能,都已经开始使用自定义数字键盘,不仅更加方便.其效果着实精致. 下面带着大家学习下,如何高仿微信的数字键盘,可以拿来直接用在自身的项目中. 先看下效果图: 1. 自定义布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

  • Android 高仿微信朋友圈拍照上传功能

    模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间左右滑动互相切换的库,同时支持图片删除的库,效果类似微信. (1) 添加PhotoPicker的架包 (2) 使用 选择图片:安卓6.0以后需要在代码中添加读写sd卡和相机的权限 当然清单文件中也需要添加的 PhotoPicker.builder() .setPhotoCount(maxPhoto)

  • Android 高仿微信朋友圈动态支持双击手势放大并滑动查看图片效果

    最近参与了开发一款旅行APP,其中包含实时聊天和动态评论功能,终于耗时几个月几个伙伴完成了,今天就小结一下至于实时聊天功能如果用户不多的情况可以scoket实现,如果用户万级就可以采用开源的smack + opnefile实现,也可以用mina开源+XMMP,至于怎么搭建和实现,估计目前github上一搜一大把,至于即时通讯怕误人子弟,暂且不做介绍,现就把实现的一个微信朋友圈的小功能介绍一下. 先上效果图: 一拿到主流的UI需求,大致分析下,需要我ListView嵌套Gridview,而grid

随机推荐