一.App的功能包括:
- 上传照片;
- DIY专属祝福语;
- 一键分享到票圈~
二.准备工作
分析xml的样式布局,采用绝对布局RelativeLayout,我们可以容易处理各个组件之间的位置关系,包括两个ImageView存放图片,一个Button作为分享,还有一个EditText输入新年心愿
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
tools:context="demo.linhao.com.springcart.MainActivity">
<ImageView
android:id="@+id/photo"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_centerHorizontal="true"
android:background="#e10d0d"
android:src="@drawable/ic_launcher"
android:padding="3dp"
android:layout_marginTop="80dp"/>
<EditText
android:id="@+id/words"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/photo"
android:background="@drawable/send_btn_pressed"
android:layout_centerHorizontal="true"
android:hint="写下您的新年愿望"
android:gravity="center"
android:layout_marginTop="70dp"/>
<Button
android:id="@+id/share"
android:layout_width="90dp"
android:layout_height="50dp"
android:background="@drawable/share"
android:layout_marginTop="30dp"
android:layout_below="@id/words"
android:layout_centerHorizontal="true"
/>
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/logo"
android:layout_below="@id/photo"
android:layout_toRightOf="@id/words"
android:padding="3dp"
android:layout_marginTop="20dp"/>
</RelativeLayout>
三、直接在清单文件设置主题是无标题全屏
<activity android:name=".MainActivity"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen">
四、第一个功能--上传本地图库相册
首先在MainActivity这个主activity文件先初始化ImageView控件,接着设置它的点击事件,这里直接用匿名类重写onClick方法,
紧接着创建Intent对象,通过隐式的启动方式获取系统图库的信息,action参数我们使用系统提供打开图像的常量ACTION_PICK,第二个是uri,直接传入null就行了
new Intent(Intent.ACTION_PICK,null);
这里我们使用startActivityForResult带有返回结果这个方法,然后覆盖onActivityResult去处理返回结果
startActivityForResult(intent,100);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == 100)
{
if (data != null)
{
mPhoto.setImageURI(data.getData());
}
}
setDataAndType()这个方法从字面我们就知道它接收date和type
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
MediaStore.Images.Media.EXTERNAL_CONTENT_URI 获取系统图库的信息 ,系统默认的MediaStore的uri地址, type使用标准的mime,下面是完整的代码
mPhoto = (ImageView) findViewById(R.id.photo);
mPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_PICK,null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
startActivityForResult(intent,100);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == 100)
{
if (data != null)
{
mPhoto.setImageURI(data.getData());
}
}
}
五、修改系统默认字体:
创建一个assets目录,在fonts文件下存放我们自定义的字体文件,用createFromAsset的接口生成新的typeface
createFromAsset(AssetManager mgr, String path)
通过getAssets()获取getAssets获取AssetManager,第二个参数传入自定义的字体库文件
mWords = (EditText) findViewById(R.id.words);
mWords.setTypeface(Typeface.createFromAsset(getAssets(), "fonts/test.ttf"));
六、到了分享到朋友圈这一环节了~
首先,你得先在微信开放者平台注册一个账号
https://open.weixin.qq.com
紧接着你就可以创建属于自己的应用了
等等,这里有一些注意事项哦:
- 系统会让你输入你的应用包名,这里必须填写你程序的包名,否则将无法调试
如何获得应用签名呢?大家可以在官网找到下载链接,地址如下,然后把apk安装到自个的真机上,还有你的应用打包后的apk,这样就可以在Gen_Signature_Android221cbf这个应用上填写自己的应用包名,系统会识别的app自动帮你生成签名,然后把它复制到填写处就OK了~
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=ff3ec4323a2d6a91027ceddd7e65418dda50e0b9&lang=zh_CN
上面的都解决了,我们就开始进入代码部分了~
首先创建一个package,必须命名为wxapi,否则将无法识别
在官网下载一个开发工具包,在libs目录下有一个jar包,复制到自己的项目中,项目右键->open module settings->dependencies->点击+号,选择file dependency把jar包添加进去,这样你就可以使用微信的接口了
接下来是代码部分
可以去官网下载完整的demo示例,把WXEntryActivity拷贝一份到wxapi中,代码如下
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
api = WXAPIFactory.createWXAPI(this,"wxf4881f29e3cf9218",false);
api.handleIntent(getIntent(),this);
super.onCreate(savedInstanceState);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
break;
}
}
我们先实例化share控件,然后为它实现点击事件,定义一个wecharShare()方法,然后把刚刚下载过来的demo直接拷贝进来,如下:
WXWebpageObject webpage = new WXWebpageObject();
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = "WebPage Title";
msg.description = "WebPage Description";
msg.mediaObject = new WXImageObject(generateSpringCart());
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneTimeline;
iwxapi.sendReq(req);
msg.mediaObject = new WXImageObject(generateSpringCart()); msg.mediaObject顾名思义就是为了获得图像或者视频,我们要把这张贺卡作为图片展示出来,所以这里new出一个WXImageObject,我们自定义generateSpringCart()方法去生成这张贺卡的Bitmap
七、获取系统截图接口:
getWindow().getDecorView();
通过getDecorView获取到decorView,decorView获取到程序显示的区域,包括标题栏,但不包括状态栏。间接可以计算状态栏高度。接着通过cache机制保存为bitmap,调用setDrawingCacheEnabled(...)方法,最会返回用getDrawingCache方法获取ImageView中的图像<br>
P.S buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,若果 cache没有建立,系统会自动调用buildDrawingCache方法生成cache。
private Bitmap generateSpringCart()
{
share.setVisibility(View.INVISIBLE);
View view = getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
return view.getDrawingCache();
}
八、可视化
因为截图后我们不想看到分享按钮,我们可以先把它在generateSpringCart()方法里面设置隐藏,View.INVISIBLE,然后share点击事件里面再设置share.setVisibility(View.VISIBLE),就可以了~
完整源码和打包后的apk下载地址我已经上传了,地址如下:
http://www.imooc.com/myclub/opus?uid=1303995;
github地址:http://github.com/lynhao (代码已上传,欢迎fork~);