【实例简介】功能:拍照,相片裁剪,给图片贴贴纸,打标签

实现相机功能

实现对图片进行裁剪的功能

图片的滤镜功能

能为图片添加贴纸(贴纸可移动,放大,旋转)

能为图片添加标签(同样可以移动)

本地保存制作好的图片,并展示

【实例截图】

【核心代码】

package com.stickercamera.app.ui;

import android.graphics.BitmapFactory;

import android.support.v4.widget.SwipeRefreshLayout;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.support.v7.widget.CardView;

import android.support.v7.widget.LinearLayoutManager;

import android.support.v7.widget.RecyclerView;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.ViewGroup;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.RelativeLayout;

import android.widget.TextView;

import com.alibaba.fastjson.JSON;

import com.common.util.DataUtils;

import com.common.util.FileUtils;

import com.common.util.StringUtils;

import com.customview.LabelView;

import com.github.skykai.stickercamera.R;

import com.melnykov.fab.FloatingActionButton;

import com.stickercamera.App;

import com.stickercamera.AppConstants;

import com.stickercamera.app.camera.CameraManager;

import com.stickercamera.app.model.FeedItem;

import com.stickercamera.app.model.TagItem;

import com.stickercamera.base.BaseActivity;

import org.json.JSONArray;

import java.util.ArrayList;

import java.util.List;

import butterknife.ButterKnife;

import butterknife.InjectView;

import de.greenrobot.event.EventBus;

/**

* 主界面

* Created by sky on 2015/7/20.

* Weibo: http://weibo.com/2030683111

* Email: 1132234509@qq.com

*/

public class MainActivity extends BaseActivity {

@InjectView(R.id.fab)

FloatingActionButton fab;

@InjectView(R.id.recycler_view)

RecyclerView mRecyclerView;

private List feedList;

private PictureAdapter mAdapter;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ButterKnife.inject(this);

EventBus.getDefault().register(this);

initView();

//如果没有照片则打开相机

String str = DataUtils.getStringPreferences(App.getApp(), AppConstants.FEED_INFO);

if (StringUtils.isNotEmpty(str)) {

feedList = JSON.parseArray(str, FeedItem.class);

}

if (feedList == null) {

CameraManager.getInst().openCamera(MainActivity.this);

} else {

mAdapter.setList(feedList);

}

}

public void onEventMainThread(FeedItem feedItem) {

if (feedList == null) {

feedList = new ArrayList();

}

feedList.add(0, feedItem);

DataUtils.setStringPreferences(App.getApp(), AppConstants.FEED_INFO, JSON.toJSONString(feedList));

mAdapter.setList(feedList);

mAdapter.notifyDataSetChanged();

}

@Override

protected void onDestroy() {

super.onDestroy();

EventBus.getDefault().unregister(this);

}

private void initView() {

titleBar.hideLeftBtn();

titleBar.hideRightBtn();

mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

mAdapter = new PictureAdapter();

mRecyclerView.setAdapter(mAdapter);

fab.setOnClickListener(v -> CameraManager.getInst().openCamera(MainActivity.this));

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.menu_main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

int id = item.getItemId();

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

//照片适配器

public class PictureAdapter extends RecyclerView.Adapter {

private List items = new ArrayList();

public void setList(List list) {

if (items.size() > 0) {

items.clear();

}

items.addAll(list);

}

@Override

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_picture, parent, false);

return new ViewHolder(v);

}

@Override

public void onBindViewHolder(ViewHolder holder, int position) {

FeedItem feedItem = items.get(position);

holder.picture.setImageBitmap(BitmapFactory.decodeFile(feedItem.getImgPath()));

holder.setTagList(feedItem.getTagList());

}

@Override

public int getItemCount() {

return items.size();

}

@Override

public void onViewRecycled(ViewHolder holder) {

// 将标签移除,避免回收使用时标签重复

holder.pictureLayout.removeViews(1, holder.pictureLayout.getChildCount() - 1);

super.onViewRecycled(holder);

}

@Override

public void onViewAttachedToWindow(ViewHolder holder) {

super.onViewAttachedToWindow(holder);

// 这里可能有问题 延迟200毫秒加载是为了等pictureLayout已经在屏幕上显示getWidth才为具体的值

holder.pictureLayout.getHandler().postDelayed(new Runnable() {

@Override

public void run() {

for (TagItem feedImageTag : holder.getTagList()) {

LabelView tagview = new LabelView(MainActivity.this);

tagview.init(feedImageTag);

tagview.draw(holder.pictureLayout,

(int) (feedImageTag.getX() * ((double) holder.pictureLayout.getWidth() / (double) 1242)),

(int) (feedImageTag.getY() * ((double) holder.pictureLayout.getWidth() / (double) 1242)),

feedImageTag.isLeft());

}

}

}, 200);

}

}

public static class ViewHolder extends RecyclerView.ViewHolder {

@InjectView(R.id.pictureLayout)

RelativeLayout pictureLayout;

@InjectView(R.id.picture)

ImageView picture;

private List tagList = new ArrayList<>();

public List getTagList() {

return tagList;

}

public void setTagList(List tagList) {

if (this.tagList.size() > 0) {

this.tagList.clear();

}

this.tagList.addAll(tagList);

}

public ViewHolder(View itemView) {

super(itemView);

ButterKnife.inject(this, itemView);

}

}

}

android相机添加一层图片,android 在照片上加标签(贴纸标签相机)源码相关推荐

  1. 怎样在android中添加背景图片?

    怎样在android中添加背景图片? 1.打开左侧的工程文件夹.打开res中的layout,双击main.xml. 2.一般的图片是jpg格式的,要把格式转化为png格式的. 3.把PNG格式的图片拖 ...

  2. java实现高德地图app,Android 高德地图入门demo,最新高德地图实现方法,附源码及apk...

    [实例简介] Android 高德地图入门demo,最新高德地图实现方法,附源码及apk [实例截图] [核心代码] GaoDeDemo ├── GaoDeDemo │   ├── app │   │ ...

  3. android flv 编码器,Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载)...

    Android 音视频深入 十七 FFmpeg 获取 RTMP 流保存为 flv (附源码下载) 项目地址 https://github.com/979451341/RtmpSave 这个项目主要代码 ...

  4. Android 小应用之一个activity实现简易手电筒(内附免费源码)

    Android小应用之一个activity实现简易手电筒(内附免费源码) 1.activity代码 2.xml代码 3.资源文件代码 4.源码压缩包(免费) 今天爷爷说他手机更新之后找不到手电筒了,我 ...

  5. 图片加载框架Picasso - 源码分析

    简书:图片加载框架Picasso - 源码分析 前一篇文章讲了Picasso的详细用法,Picasso 是一个强大的图片加载缓存框架,一个非常优秀的开源库,学习一个优秀的开源库,,我们不仅仅是学习它的 ...

  6. swiper图片轮播(左中右) (含源码)- 案例篇

    swiper图片轮播(左中右) (含源码) - 案例篇 效果图: 代码: <!DOCTYPE html> <html lang="en"> <head ...

  7. css实现的图片列表切换轮播特效html页面前端源码

    大家好,今天给大家介绍一款, css实现的图片列表切换轮播特效html页面前端源码(图1).送给大家哦,获取方式在本文末尾. 图1 特效非常炫酷,可以用于制造音乐播放切换或视频播放切换前端(图2) 图 ...

  8. android编程 自动裁剪图片,Android编程实现调用相册、相机及拍照后直接裁剪的方法...

    本文实例讲述了Android编程实现调用相册.相机及拍照后直接裁剪的方法.分享给大家供大家参考,具体如下: package com.cvte.health.phone; import java.io. ...

  9. 【Android 安装包优化】Android 中使用 SVG 图片 ( Android 5.0 以下的矢量图方案 | 矢量图生成为 PNG 图片 )

    文章目录 一.Android 5.0 以下的矢量图方案 二.矢量图生成为 PNG 图片 三.完整的 build.gradle 构建脚本 四.编译效果 五.参考资料 一.Android 5.0 以下的矢 ...

最新文章

  1. 启动马达接线实物图_电工知识:三相电机正反转的完整接线,实物讲解,原理分析...
  2. Entity Framework
  3. 正确理解HTML,XHTML页面的头部doctype定义
  4. nginx alias
  5. 电影编码JPEG2000与H.264
  6. python安装详细步骤mac_mac如何安装python3
  7. Mybatis 中文文档
  8. 教你win10忘记密码强制重置密码的方法
  9. Java+AutoCAD-坐标系转换
  10. 今日金融词汇---股价复权,是什么?
  11. CRM软件成功案例解析
  12. 多微博账号同时发微博的插件--fawave
  13. GB2312编码范围
  14. 【CAN】PCAN连线
  15. matlab 空间曲面的绘制
  16. JWT详细教程与使用
  17. 省一级计算机ppt,江苏省计算机一级PPT课件.ppt
  18. 直播 | 乐高式微服务化改造
  19. GripSeal格雷希尔G80系列内螺纹快速接头的使用方法 G80L-M10 M12
  20. 高考失利只能进清华,35岁成阿里最年轻技术副总裁,他来自另一个平行世界!...

热门文章

  1. tensorflow之神经网络层:Dense,dense,Dropout,dropout
  2. 继承FlexboxLayout自定义可自动换行的tag标签
  3. TDengine 应用实录:存储缩减超过 60%,HBase 等集群指数级下线
  4. SpringBoot 项目小彩蛋--启动标识与启动成功标识
  5. 洛谷--P1827 [USACO3.4]美国血统 American Heritage
  6. c语言open函数打开文件方式,Linux中C语言open函数打开或创建文件详细讲解
  7. Excel 2010 SQL应用086 随机排序
  8. 5分钟从零搭建OpenVPN服务器
  9. Sql server 期末知识点复习
  10. 编译前奏:高级程序设计语言概述