|
|
@@ -0,0 +1,290 @@
|
|
|
+package com.kfzs.cfyl.media.fragment;
|
|
|
+
|
|
|
+import android.app.Activity;
|
|
|
+import android.content.Context;
|
|
|
+import android.content.res.Configuration;
|
|
|
+import android.graphics.Bitmap;
|
|
|
+import android.graphics.BitmapFactory;
|
|
|
+import android.graphics.Color;
|
|
|
+import android.support.v4.app.Fragment;
|
|
|
+import android.support.v4.view.ViewPager;
|
|
|
+import android.view.View;
|
|
|
+import android.view.ViewGroup;
|
|
|
+import android.widget.ImageView;
|
|
|
+
|
|
|
+import com.kfzs.cfyl.media.BaseFragment;
|
|
|
+import com.kfzs.cfyl.media.BaseListFgtActivity;
|
|
|
+import com.kfzs.cfyl.media.R;
|
|
|
+import com.kfzs.cfyl.media.activity.ActCutVideo;
|
|
|
+import com.kfzs.cfyl.media.adapter.ViewPagerFragmentAdapter;
|
|
|
+import com.kfzs.cfyl.media.bean.Size;
|
|
|
+import com.kfzs.cfyl.media.util.BitmapUtil;
|
|
|
+import com.kfzs.cfyl.media.util.G;
|
|
|
+import com.kfzs.cfyl.media.util.ListUtil;
|
|
|
+import com.kfzs.cfyl.share_library.util.LogUtil;
|
|
|
+import com.sheep.gamegroup.model.entity.Video;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import cn.hzw.doodle.DoodleActivity;
|
|
|
+import cn.hzw.doodle.DoodleBitmap;
|
|
|
+import cn.hzw.doodle.DoodleColor;
|
|
|
+import cn.hzw.doodle.DoodleOnTouchGestureListener;
|
|
|
+import cn.hzw.doodle.DoodleParams;
|
|
|
+import cn.hzw.doodle.DoodlePen;
|
|
|
+import cn.hzw.doodle.DoodleShape;
|
|
|
+import cn.hzw.doodle.DoodleText;
|
|
|
+import cn.hzw.doodle.DoodleTouchDetector;
|
|
|
+import cn.hzw.doodle.DoodleView;
|
|
|
+import cn.hzw.doodle.IDoodleListener;
|
|
|
+import cn.hzw.doodle.core.IDoodle;
|
|
|
+import cn.hzw.doodle.core.IDoodleItem;
|
|
|
+import cn.hzw.doodle.core.IDoodlePen;
|
|
|
+import cn.hzw.doodle.core.IDoodleSelectableItem;
|
|
|
+import cn.hzw.doodle.core.IDoodleTouchDetector;
|
|
|
+import rx.functions.Action1;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Created by realicing on 2018/12/20.
|
|
|
+ * realicing@sina.com
|
|
|
+ * 涂鸦功能
|
|
|
+ */
|
|
|
+public class FgtDoodle extends BaseFragment {
|
|
|
+ @Override
|
|
|
+ public int getLayoutId() {
|
|
|
+ return R.layout.media_fgt_doodle;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ViewPager media_viewPager;
|
|
|
+ @Override
|
|
|
+ public void onViewCreated() {
|
|
|
+ media_viewPager = findViewById(R.id.media_viewPager);
|
|
|
+
|
|
|
+ List<Fragment> fragmentList = new ArrayList<>();
|
|
|
+ fragmentList.add(new FgtColorList().loadData(new Action1<Integer>() {
|
|
|
+ @Override
|
|
|
+ public void call(Integer color) {
|
|
|
+ selectColor(color);
|
|
|
+ }
|
|
|
+ }));
|
|
|
+ ViewPagerFragmentAdapter mViewPagerFragmentAdapter = new ViewPagerFragmentAdapter(getChildFragmentManager(), fragmentList);
|
|
|
+ media_viewPager.setAdapter(mViewPagerFragmentAdapter);
|
|
|
+ media_viewPager.setOffscreenPageLimit(mViewPagerFragmentAdapter.getCount());
|
|
|
+
|
|
|
+ ImageView media_video_back_iv = findViewById(R.id.media_video_back_iv);
|
|
|
+ media_video_back_iv.setOnClickListener(new View.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(View view) {
|
|
|
+ onClickBackImg(view);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ View media_video_undo_tv = findViewById(R.id.media_video_undo_tv);
|
|
|
+ media_video_undo_tv.setOnClickListener(new View.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(View view) {
|
|
|
+ onClickUndo(view);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ View media_video_redo_tv = findViewById(R.id.media_video_redo_tv);
|
|
|
+ media_video_redo_tv.setOnClickListener(new View.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(View view) {
|
|
|
+ onClickRedo(view);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ View media_video_reset_tv = findViewById(R.id.media_video_reset_tv);
|
|
|
+ media_video_reset_tv.setOnClickListener(new View.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(View view) {
|
|
|
+ onClickReset(view);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ View media_edit_video_sure_iv = findViewById(R.id.media_edit_video_sure_iv);
|
|
|
+ media_edit_video_sure_iv.setOnClickListener(new View.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(View view) {
|
|
|
+ onClickNext(view);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ //点击返回
|
|
|
+ public void onClickBackImg(View view) {
|
|
|
+ Activity activity = getActivity();
|
|
|
+ if (activity instanceof BaseListFgtActivity) {
|
|
|
+ ((BaseListFgtActivity) activity).switchFgt(FgtEditVideoTypeList.POSITION, this);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //点击撤销
|
|
|
+ public void onClickUndo(View view) {
|
|
|
+ if(mDoodleView != null){
|
|
|
+ IDoodleItem lastItem = ListUtil.getLast(mDoodleView.getAllItem());
|
|
|
+ if(lastItem != null){
|
|
|
+ mDoodleView.removeItem(lastItem);
|
|
|
+ redoList.add(lastItem);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private List<IDoodleItem> redoList = new ArrayList<>();
|
|
|
+ //点击重做
|
|
|
+ public void onClickRedo(View view) {
|
|
|
+ if(mDoodleView != null){
|
|
|
+ IDoodleItem lastItem = ListUtil.getLast(redoList);
|
|
|
+ if(lastItem != null){
|
|
|
+ redoList.remove(lastItem);
|
|
|
+ mDoodleView.addItem(lastItem);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //点击重置
|
|
|
+ public void onClickReset(View view) {
|
|
|
+ if(mDoodleView != null){
|
|
|
+ mDoodleView.clear();
|
|
|
+ redoList.clear();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //点击保存
|
|
|
+ public void onClickNext(View view) {
|
|
|
+ if(mDoodleView != null){
|
|
|
+ mDoodleView.save();
|
|
|
+ }
|
|
|
+ onClickBackImg(view);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void selectColor(Integer color) {
|
|
|
+ if(mDoodleView != null){
|
|
|
+ if(mDoodleView.getColor() instanceof DoodleColor){
|
|
|
+ ((DoodleColor) mDoodleView.getColor()).setColor(color);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static File getDoodleFile(Context context){
|
|
|
+ File dir = context.getDir("png", Context.MODE_PRIVATE);
|
|
|
+ return new File(dir, "doodle.png");
|
|
|
+ }
|
|
|
+ private void initDoodleView(final ViewGroup media_fgt_doodle_container) {
|
|
|
+ // 涂鸦参数
|
|
|
+ mDoodleParams = new DoodleParams();
|
|
|
+ mDoodleParams.mIsFullScreen = true;
|
|
|
+ mDoodleParams.mIsDrawableOutside = true;
|
|
|
+ // 初始画笔大小
|
|
|
+ mDoodleParams.mPaintUnitSize = DoodleView.DEFAULT_SIZE;
|
|
|
+ final Context context = media_fgt_doodle_container.getContext();
|
|
|
+ final File doodleFile = getDoodleFile(context);
|
|
|
+ final Bitmap loadBitmap = BitmapUtil.getDefaultBitmap(getResources(), data);
|
|
|
+ doodleFile.deleteOnExit();//删除之前的图片
|
|
|
+ mDoodle = mDoodleView = new DoodleView(context, loadBitmap, new IDoodleListener() {
|
|
|
+ /*
|
|
|
+ called when save the doodled iamge.
|
|
|
+ 保存涂鸦图像时调用
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void onSaved(IDoodle doodle, Bitmap bgBitmap, Runnable callback) {
|
|
|
+ Bitmap logo = BitmapFactory.decodeResource(context.getResources(), R.drawable.media_sheep_logo_3);
|
|
|
+ int w = bgBitmap.getWidth();
|
|
|
+ int h = bgBitmap.getHeight();
|
|
|
+ Size size = new Size().setWidth(w).setHeight(h).setX(w * 30 / 750).setY(w * 60 / 750);
|
|
|
+ Bitmap logoFull = BitmapUtil.createBigLogo(logo, size);
|
|
|
+ Bitmap result = BitmapUtil.mergeBitmap(bgBitmap, logoFull);
|
|
|
+ BitmapUtil.saveImage(result, doodleFile);
|
|
|
+ BitmapUtil.recycle(logo);
|
|
|
+ BitmapUtil.recycle(logoFull);
|
|
|
+ BitmapUtil.recycle(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ called when it is ready to doodle because the view has been measured. Now, you can set size, color, pen, shape, etc.
|
|
|
+ 此时view已经测量完成,涂鸦前的准备工作已经完成,在这里可以设置大小、颜色、画笔、形状等。
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void onReady(IDoodle doodle) {
|
|
|
+ float size = mDoodleParams.mPaintUnitSize > 0 ? mDoodleParams.mPaintUnitSize * mDoodle.getUnitSize() : 0;
|
|
|
+ if (size <= 0) {
|
|
|
+ size = mDoodleParams.mPaintPixelSize > 0 ? mDoodleParams.mPaintPixelSize : mDoodle.getSize();
|
|
|
+ }
|
|
|
+ // 设置初始值
|
|
|
+ mDoodle.setSize(size);
|
|
|
+ // 选择画笔
|
|
|
+ mDoodle.setPen(DoodlePen.BRUSH);
|
|
|
+ mDoodle.setShape(DoodleShape.HAND_WRITE);
|
|
|
+ if (mDoodleParams.mZoomerScale <= 0) {
|
|
|
+ findViewById(cn.hzw.doodle.R.id.btn_zoomer).setVisibility(View.GONE);
|
|
|
+ }
|
|
|
+ mDoodle.setZoomerScale(mDoodleParams.mZoomerScale);
|
|
|
+
|
|
|
+ // 每个画笔的初始值
|
|
|
+ mPenSizeMap.put(DoodlePen.BRUSH, mDoodle.getSize());
|
|
|
+ mPenSizeMap.put(DoodlePen.COPY, DoodleActivity.DEFAULT_COPY_SIZE * mDoodle.getUnitSize());
|
|
|
+ mPenSizeMap.put(DoodlePen.ERASER, mDoodle.getSize());
|
|
|
+ mPenSizeMap.put(DoodlePen.TEXT, DoodleActivity.DEFAULT_TEXT_SIZE * mDoodle.getUnitSize());
|
|
|
+ mPenSizeMap.put(DoodlePen.BITMAP, DoodleActivity.DEFAULT_BITMAP_SIZE * mDoodle.getUnitSize());
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ mTouchGestureListener = new DoodleOnTouchGestureListener(mDoodleView, new DoodleOnTouchGestureListener.ISelectionListener() {
|
|
|
+ /*
|
|
|
+ called when the item(such as text, texture) is selected/unselected.
|
|
|
+ item(如文字,贴图)被选中或取消选中时回调
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void onSelectedItem(IDoodle doodle, IDoodleSelectableItem selectableItem, boolean selected) {
|
|
|
+ //do something
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ called when you click the view to create a item(such as text, texture).
|
|
|
+ 点击View中的某个点创建可选择的item(如文字,贴图)时回调
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void onCreateSelectableItem(IDoodle doodle, float x, float y) {
|
|
|
+ //do something
|
|
|
+ if (mDoodle.getPen() == DoodlePen.TEXT) {
|
|
|
+ IDoodleSelectableItem item = new DoodleText(mDoodle, "hello", 20 * mDoodle.getUnitSize(), new DoodleColor(Color.RED), x, y);
|
|
|
+ mDoodle.addItem(item);
|
|
|
+ } else if (mDoodle.getPen() == DoodlePen.BITMAP) {
|
|
|
+ IDoodleSelectableItem item = new DoodleBitmap(mDoodle, loadBitmap, 80 * mDoodle.getUnitSize(), x, y);
|
|
|
+ mDoodle.addItem(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+// create touch detector, which dectects the gesture of scoll, scale, single tap, etc.
|
|
|
+// 创建手势识别器,识别滚动,缩放,点击等手势
|
|
|
+ IDoodleTouchDetector detector = new DoodleTouchDetector(media_fgt_doodle_container.getContext(), mTouchGestureListener);
|
|
|
+ mDoodleView.setDefaultTouchDetector(detector);
|
|
|
+
|
|
|
+// Setting parameters.设置参数
|
|
|
+ mDoodleView.setPen(DoodlePen.TEXT);
|
|
|
+ mDoodleView.setShape(DoodleShape.HAND_WRITE);
|
|
|
+ mDoodleView.setColor(new DoodleColor(Color.WHITE));
|
|
|
+ mDoodle.setIsDrawableOutside(mDoodleParams.mIsDrawableOutside);
|
|
|
+
|
|
|
+ media_fgt_doodle_container.addView(mDoodleView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
|
|
+ }
|
|
|
+
|
|
|
+ private DoodleView mDoodleView;
|
|
|
+ private IDoodle mDoodle;
|
|
|
+ private DoodleParams mDoodleParams;
|
|
|
+ private Map<IDoodlePen, Float> mPenSizeMap = new HashMap<>(); //保存每个画笔对应的最新大小
|
|
|
+ private DoodleOnTouchGestureListener mTouchGestureListener;
|
|
|
+
|
|
|
+ private Video data;
|
|
|
+ public void loadData(Video data) {
|
|
|
+ if(this.data == null) {
|
|
|
+ this.data = data;
|
|
|
+ ViewGroup media_fgt_doodle_container = findViewById(R.id.media_fgt_doodle_container);
|
|
|
+ initDoodleView(media_fgt_doodle_container);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|