在开发项目的APP中,图片是重要表现形式,对图片进行适当的编辑(裁剪,设置聚光区,添加文字及图形标记等),可以增强图片的表现力。为了便于操作使用,APP中通过自定RelativeLayout实现通用图片编辑,并计划做成一个开源项目,这里将主要的技术和代码进行分享。这个自定RelativeLayout开始是用于在图片界面中,动态添加textView及EditText的,之后又增加了图片缩放及拖移,目前又增加了图片的编辑功能。这里介绍的内容包括自定RelativeLayout,关联java类的代码及应用实例简介。
一, 主要功能
1),动态添加textView及EditText
2), “缩放,拖移”查看图片
3), 图片编辑
A), 设置裁剪或聚光区
B), 添加文字
C), 添加图形标记
D), 删除已添加的项目
E), 拖移已添加的项目
二,自定RelativeLayout
这个自定RelativeLayout除了图片的“缩放,拖移”,其它的一些功能是根据需要动态设置添加的,界面中操作按钮显示符号,也是动态设置的。图片编辑参数是通过回调(Callback)在主界面完成的,并未将所有功能完全封装在自定RelativeLayout内。
package com.bi3eview.newstart60.local.doTask; import android.os.Environment; import android.content.Intent; import android.graphics.Matrix; import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.text.Layout.Alignment; import android.text.StaticLayout; import android.text.TextPaint; import android.media.RingtoneManager; import android.media.MediaPlayer; import android.media.Ringtone; import android.media.RingtoneManager; import android.media.SoundPool; import android.content.pm.PackageManager; import android.net.Uri; import android.provider.MediaStore; import android.graphics.Region; import android.os.Vibrator; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.widget.EditText; import android.content.Context; import android.graphics.Paint; import android.graphics.Typeface; import android.graphics.Point; import android.graphics.Canvas; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.support.annotation.NonNull; import android.support.v4.widget.ViewDragHelper; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; import android.widget.ImageView; import android.widget.RelativeLayout; import com.bi3eview.newstart60.local.COMCONST; import com.bi3eview.newstart60.local.R; import com.bi3eview.newstart60.local.SelfWidget.PathParser; import com.bi3eview.newstart60.local.Util.buttonData; import com.bi3eview.newstart60.local.Util.buttonDrawUtil; import com.bi3eview.newstart60.local.Util.BitMapUtil; import com.bi3eview.newstart60.local.Util.GraphicItemUtil; import com.bi3eview.newstart60.local.Util.GraphicsExpItem; import com.bi3eview.newstart60.local.constant.Constants; import com.bi3eview.newstart60.local.pubcom.graClipTextShapeView; import com.google.zxing.util.BitmapUtil; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.FileNotFoundException; /** * create by bs60 on 2020.01.17 * */ public class TaskDataLLayout extends RelativeLayout { public static Bitmap mcur_photoBipmap = null; private Rect mFrameRect; private Context mcontext = null; private Paint mPaint = null; private Matrix matrix; private Point center; private Point bmpCenter; private long mButtonDownTimev = 0; private long mButtonUpTimev = 100; private long mTimeMove = 100; private final int LONGPRESS_TIME = 1500; buttonDrawUtil mButDrawMenuHandle = null; boolean mButtonMenuResetblv = true; GraphicItemUtil mgraItemHandle = null; private static int miViewWidth = -1; private static int miViewHeight = -1; private final int SAVEUPDATE_BUTTON = 3000; private long mSaveButtonPressed; private Bitmap mcurBbitmap; boolean cnewPhotoblv = false; boolean drawBmpLockblv = false; boolean bdataShowblv = false; boolean mLongClickblv = false; boolean mLongClickButtonblv = false; boolean mLongMoveblv = false; boolean mFingerNum2blv = false; int mlongThreadProcessCode = 0; float mcurScale; final int xoffv = 0;// 300; final int yoffv = 0;// 500; final int five=5<<24; /** view.setTag(int,Object)中的int值必须要左移24位才行,这样才不会报错 */ private ViewDragHelper mViewDragHelper; private boolean mDragEnable = true; //... private Point mAutoBackOriginPos = new Point(); private float minimal = 100.0f; private float miniShowWhv = 100.0f; private int mbuttonMoveWidth = 60; String mstrTraceInfo = ""; String mdownNextInfo = ""; String m_pkName = ""; String m_EDITPICDIRName = ""; String msaveEditPictureName = ""; String mcur_TIMEFILENAME = "2022-09-28_18_36_26"; private float screenW;//屏幕宽度 private float screenH;//屏幕高度 private int drawScreenW;//屏幕宽度 private int drawScreenH;//屏幕高度 private float miBitmapfXc = 0; private float miBitmapfYc = 0; //单指按下的坐标 private float mFirstX = 0.0f; private float mFirstY = 0.0f; //单指离开的坐标 private float lastMoveX =-1f; private float lastMoveY =-1f; //两指的中点坐标 private float centPointX; private float centPointY; //是否是长按事件 boolean isLongClick; //移动相关 float downX, downY, moveX, moveY; //图片的绘制坐标 private float translationX = 0.0f; private float translationY = 0.0f; //图片的原始宽高 private float primaryW; private float primaryH; //图片当前宽高 private float currentW; private float currentH; private float scale = 1.0f; private float maxScale, minScale; RectF mdrawClipRectF = new RectF(0f,0f,20f,20f); private int mLocker = 0; private float fingerDistance = 0.0f; private boolean isLoaded = false; private boolean isClickInImage = false; private boolean clickDownFirstblv = false; private boolean mbuttonClickblv = false; private boolean mPressBreak = false; private int mcurClipAlpha = 220; private byte mbClipAreaKind = buttonData.CLIPAREAKIND_OVAL; private int iClipColorv = Color.argb(192,128,128,128); private int StrokeWidth = 5; private Rect mCliprect = new Rect(0,0,0,0);//手动绘制矩形 private boolean mdrawClipRectblv = false; private boolean mselectClipOperblv = false; // graphics item mark private float mgraItem_MarkFscale = 1.0f; private float mgraItem_MarkWide = 10.0f; private int mgraItem_Xoff = 10; private int mgraItem_Yoff = 10; // text private byte mbTextKind = buttonData.TEXTICONKIND_HORIZONTAL; private int miTextColorv = Color.GREEN; private int miTextSize = 26; private String mstrMarkname = ""; boolean mtxtShowblv = false; int mtxtshowXpos = 0; int mtxtshowYpos = 0; private boolean mdrawtxtClickblv = false; private RectF mdrawtxt_markFRect = new RectF(0f,0f,20f,20f); // draw private byte mbDrawKind = buttonData.MARKICONKIND_LINE; private int miDrawColorv = Color.RED; private int miLinewide = 26; private int miTransparentValue = 80; private int miDrawLongMoveLen = 80; boolean mdrawShowblv = false; boolean mDrawLongMoveblv = false; private boolean mdrawRubberClickblv = false; private RectF mdrawRubber_markFRect = new RectF(0f,0f,20f,20f); private float mdrawFirstX = 0.0f; private float mdrawFirstY = 0.0f; private float mdrawFirstPreX = 0.0f; private float mdrawFirstPreY = 0.0f; private float mSecondX = 0.0f; private float mSecondY = 0.0f; boolean mdrawMarkSymblv = false; boolean mdrawDownPrimitiveblv = false; boolean mdrawItemDelDragClickblv = false; boolean mondraw_Processblv = true; boolean mdraw_DragMoveLockblv = false; private ArrayList<Point> mPolyLineList = null; // check item public static final byte CHECKITEMGRA_CLIP = 1; public static final byte CHECKITEMGRA_GRANUM = 2; //创建一个Handler final int PICTURERESTORE = 1000; final int PICTUREONDRAW = 2000; final int PICTURESAVEUPDATE = 3000; final int DOWNLONGCLICKCHECK = 3003; final int APPENDGRAPHICSITEM_CLIP = 3006; final int APPENDGRAPHICSITEM_TEXT = 3007; final int DRAGMOVEGRAITEM_REDRAW = 4000; private Handler handler = new Handler() { public void handleMessage(Message msg) { String operCmd; switch (msg.what) { case DRAGMOVEGRAITEM_REDRAW: invalidate(); break; case APPENDGRAPHICSITEM_TEXT: graphics_appendItem_Text(); break; case APPENDGRAPHICSITEM_CLIP: graphics_appendItem_Clip(); break; case DOWNLONGCLICKCHECK: if(mlongThreadProcessCode < 9) { if (!mPressBreak && mbuttonClickblv) { if (!mFingerNum2blv && !mLongMoveblv) { mTimeMove = System.currentTimeMillis(); long durationMs = mTimeMove - mButtonDownTimev; if (durationMs > LONGPRESS_TIME) { mbuttonClickblv = false; isLongClick = true; MotionEvent event = null; if(!mLongClickButtonblv) { mLongClickButtonblv = true; isSelectButton(event, true); } } } } } mlongThreadProcessCode = 0; break; case PICTURESAVEUPDATE: saveEditImage(); invalidate(); break; case PICTUREONDRAW: invalidate(); break; case PICTURERESTORE: cnewPhotoblv = false; // mstrTraceInfo = mstrTraceInfo+">>handler";//xxxxxx invalidate(); break; } } }; public TaskDataLLayout(Context context) { this(context, null); mPaint = new Paint(); // 需要调用下面的方法才会执行onDraw方法 setWillNotDraw(false); mcontext = context; initset(); } public TaskDataLLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); mPaint = new Paint(); // 需要调用下面的方法才会执行onDraw方法 setWillNotDraw(false); mcontext = context; initset(); } public TaskDataLLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); // 需要调用下面的方法才会执行onDraw方法 setWillNotDraw(false); // setWillNotDraw(false);/** 2019.09.01 */ mcontext = context; if (mDragEnable) { mViewDragHelper = ViewDragHelper.create(this, createDrawCallback() ); } initset(); } private void initset() { mSaveButtonPressed = 0; mlongThreadProcessCode = 0; mLongClickButtonblv = false; cnewPhotoblv = false; drawBmpLockblv = false; bdataShowblv = true; mButDrawMenuHandle = new buttonDrawUtil(); mButtonMenuResetblv = true; mgraItemHandle = new GraphicItemUtil(); mdrawClipRectblv = false; buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; buttonDrawUtil.mButtonInfoblv = false; buttonDrawUtil.mButtonResetblv = false; buttonDrawUtil.mButtonRedrawblv = false; mbClipAreaKind = (byte)Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_CLIPKIND,buttonData.CLIPAREAKIND_RECT); iClipColorv = Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_CLIPCOLOR,Color.WHITE); mcurClipAlpha = Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_CLIPTRANSPARENT,202); mbTextKind = (byte)Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_TEXTKIND,buttonData.TEXTICONKIND_HORIZONTAL); miTextColorv = Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_TEXTCOLOR,Color.GREEN); miTextSize = Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_TEXTSIZE,26); mstrMarkname = Constants.SharedPerferenceData.GetStringSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_TEXTNAME,"Welcome to Beijing!"); mbDrawKind = (byte)Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_MARKKIND,buttonData.MARKICONKIND_LINE); miDrawColorv = Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_MARKCOLOR,Color.RED); miLinewide = Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_MARKLINEWD,26); miTransparentValue = Constants.SharedPerferenceData.GetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_GRAOHICSEDIT_MARKTRANSPARENT,200); mPolyLineList = new ArrayList(); } public static Bitmap bitMapScale(Bitmap bitmap,float scale) { Matrix matrix = new Matrix(); matrix.postScale(scale,scale); //长和宽放大缩小的比例 Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); return resizeBmp; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save(); int iwidth = canvas.getWidth(); int iheight = canvas.getHeight(); miViewWidth = iwidth; miViewHeight = iheight; mPaint.setColor(Color.RED); mPaint.setStyle(Paint.Style.STROKE); mPaint.setColor(Color.GREEN); mPaint.setStrokeWidth(1); GraphicItemUtil.mcurMarkType = GraphicItemUtil.MARKTYPE_EMPTY; // 重置显示按钮 if(mButtonMenuResetblv || buttonDrawUtil.mButtonResetblv){ mButtonMenuResetblv = false; checkResetButtonShow(); } if(GraphicItemUtil.miItemActiveNum > 0) { if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_DELETE) { GraphicItemUtil.mcurMarkType = GraphicItemUtil.MARKTYPE_DELETE; } if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_DRAGMOVE) { GraphicItemUtil.mcurMarkType = GraphicItemUtil.MARKTYPE_DRAGMOVE; } } if(mcur_photoBipmap != null && drawBmpLockblv == false) { drawBmpLockblv = true; if (cnewPhotoblv == false) { // 更新背景图后,重新设置显示参数 cnewPhotoblv = true; screenW = canvas.getWidth(); screenH = canvas.getHeight(); drawScreenW = (int)canvas.getWidth(); drawScreenH = (int)canvas.getHeight(); minimal = screenW; if (screenH < screenW) minimal = screenH; miniShowWhv = minimal/4; setMaxMinScale(); translationX = (screenW - mcur_photoBipmap.getWidth() * scale) / 2; translationY = (screenH - mcur_photoBipmap.getHeight() * scale) / 2; } if (isLoaded) { // 处理背景图缩放显示 imageZoomView(canvas); } drawBmpLockblv = false; } if(mgraItemHandle.checkGetGraItemNum() > 0){ // 显示图形标记项目 GraphicItemUtil.FSCALE = scale; GraphicItemUtil.TRANSLATIONx = translationX; GraphicItemUtil.TRANSLATIONy = translationY; mgraItemHandle.GraphicsOnDraw(canvas); } if(mdrawClipRectblv){ // 画当前"裁剪或聚光"项目 draw_ClipFocusItem(canvas); } if(mtxtShowblv && buttonData.cActive_IDitem == buttonData.BUTTONIDNO_TEXT){ // 画当前"文字"项目 draw_TextItem(canvas); } mdrawMarkSymblv = false; if(mdrawShowblv && buttonData.cActive_IDitem == buttonData.BUTTONIDNO_RUBBER){ // 画当前"标记"项目 draw_MarkItem(canvas); } if(mButDrawMenuHandle != null && bdataShowblv != true) { // 绘制菜单按钮 mButDrawMenuHandle.redrawButtonLst(canvas); } mondraw_Processblv = false; canvas.restore(); } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); } public void setAppPackageName(String strPkname) { m_pkName = strPkname; m_EDITPICDIRName = strPkname; } public void SetEditPictureFiledir(String strPicdirname) { m_EDITPICDIRName = strPicdirname; } public int GetCanvasWidth() { return miViewWidth; } public int GetCanvasHeight() { return miViewHeight; } private boolean handle_NewGraphicsItem(byte gkind){ boolean bnewblv = false; if(gkind == buttonData.BUTTONIDNO_TEXT){ int ixpos = (int) ((mtxtshowXpos - translationX) / scale); int iypos = (int) ((mtxtshowYpos - translationY) / scale); mgraItemHandle.appendOrupdateTextItem(mbTextKind,miTextColorv,miTextSize,ixpos,iypos,mstrMarkname); bnewblv = true; buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; mButtonCallback.onButtonClick(buttonData.BUTTONIDNO_VERIFYCLIP, 0,0,true); mButDrawMenuHandle.clearActiveItem(); } // if(gkind == buttonData.BUTTONIDNO_RUBBER){ if(mbDrawKind == buttonData.MARKICONKIND_LINE){ if(mPolyLineList.size() >= 2){ ArrayList<Point> cPointLst= new ArrayList<>(); for(int jp = 0;jp < mPolyLineList.size();jp++){ Point cpoint = new Point(); cpoint.x = (int) ((mPolyLineList.get(jp).x - translationX) / scale); cpoint.y = (int) ((mPolyLineList.get(jp).y - translationY) / scale); cPointLst.add(cpoint); } mgraItemHandle.appendOrupdateDrawItem(mbDrawKind,miDrawColorv,miLinewide,miTransparentValue,cPointLst); } } if(mbDrawKind == buttonData.MARKICONKIND_OVAL || mbDrawKind == buttonData.MARKICONKIND_SOLIDOVAL){ float fLeft = mdrawFirstPreX; float fRight = mSecondX; if(fLeft > fRight){ fLeft = mSecondX; fRight = mdrawFirstPreX;; } float fTop = mdrawFirstPreY; float fBottom = mSecondY; if(fTop > fBottom){ fTop = mSecondY; fBottom = mdrawFirstPreY; }; ArrayList<Point> cPointLst= new ArrayList<>(); Point cpoint = new Point(); cpoint.x = (int) ((fLeft - translationX) / scale); cpoint.y = (int) ((fTop - translationY) / scale); cPointLst.add(cpoint); Point cpoint2 = new Point(); cpoint2.x = (int) ((fRight - translationX) / scale); cpoint2.y = (int) ((fBottom - translationY) / scale); cPointLst.add(cpoint2); mgraItemHandle.appendOrupdateDrawItem(mbDrawKind,miDrawColorv,miLinewide,miTransparentValue,cPointLst); } if(mbDrawKind == buttonData.MARKICONKIND_ARROW){ ArrayList<Point> cPointLst= new ArrayList<>(); Point cpoint = new Point(); cpoint.x = (int) ((mdrawFirstPreX - translationX) / scale); cpoint.y = (int) ((mdrawFirstPreY - translationY) / scale); cPointLst.add(cpoint); Point cpoint2 = new Point(); cpoint2.x = (int) ((mSecondX - translationX) / scale); cpoint2.y = (int) ((mSecondY - translationY) / scale); cPointLst.add(cpoint2); mgraItemHandle.appendOrupdateDrawItem(mbDrawKind,miDrawColorv,miLinewide,miTransparentValue,cPointLst); } bnewblv = true; buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; mButtonCallback.onButtonClick(buttonData.BUTTONIDNO_VERIFYCLIP, 0,0,true); mButDrawMenuHandle.clearActiveItem(); } // if(gkind == buttonData.BUTTONIDNO_CLIP){ Rect clipRect = new Rect(); clipRect.left = (int) ((mdrawClipRectF.left - translationX) / scale); clipRect.right = (int) ((mdrawClipRectF.right - translationX) / scale); clipRect.top = (int) ((mdrawClipRectF.top - translationY) / scale); clipRect.bottom = (int) ((mdrawClipRectF.bottom - translationY) / scale); mgraItemHandle.appendOrupdateClipItem(mbClipAreaKind,iClipColorv,clipRect); GraphicItemUtil.miClipAlpha = mcurClipAlpha; bnewblv = true; buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; mButtonCallback.onButtonClick(buttonData.BUTTONIDNO_VERIFYCLIP, 0,0,true); mButDrawMenuHandle.clearActiveItem(); } return bnewblv; }; public void updateSetClip(byte bkind,int iclipColor,int iTransparent) { mbClipAreaKind = bkind; iClipColorv = iclipColor; mcurClipAlpha = iTransparent; } public void updateSetText(byte bkind,int itxtColor,int ifntsize,String markName) { mbTextKind = bkind; miTextColorv = itxtColor; miTextSize = ifntsize; mstrMarkname = markName; } public void updateSetDraw(byte bkind,int iColor,int iLinewide,int iTransparent) { mbDrawKind = bkind; miDrawColorv = iColor; miLinewide = iLinewide; miTransparentValue = iTransparent; } public void SAVEINITRESET(String strTimeFilename) { mcur_TIMEFILENAME = strTimeFilename; GraphicItemUtil.mcurMarkType = GraphicItemUtil.MARKTYPE_EMPTY; if(mgraItemHandle != null) { mButDrawMenuHandle.resetActiveButton(); } buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; } private void checkResetButtonShow() { if(mgraItemHandle != null) { mButDrawMenuHandle.checkResetButtonShow(GraphicItemUtil.miundoPosj, GraphicItemUtil.miItemActiveNum); } } private void imageZoomView(Canvas canvas){ currentW = primaryW * scale; currentH = primaryH * scale; matrix.reset(); matrix.postScale(scale, scale);//x轴y轴缩放 peripheryJudge(); matrix.postTranslate(translationX, translationY);//中点坐标移动 canvas.drawBitmap(mcur_photoBipmap, matrix, null); } /** * 图片边界检查 */ private void peripheryJudge(){ float screenWmin = screenW/2-mcur_photoBipmap.getWidth()*scale; float screenWmax = screenW/2; float screenHmin = screenH/2- mcur_photoBipmap.getHeight()*scale; float screenHmax = screenH/2; if (translationX < screenWmin){ translationX = screenWmin; } if (translationY < screenHmin){ translationY = screenHmin; } if (translationX > screenWmax){ translationX = screenWmax; } if (translationY > screenHmax){ translationY = screenHmax; } } public void appendEditButton(buttonData cbutData) { if(mButDrawMenuHandle != null){ mButDrawMenuHandle.appendButtonItem(cbutData); }; } // about measure onLayout @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 1.measure children and measure self int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); int width = 0; int height = 0; int lineWidth = 0; int lineHeight = 0; int childCount = getChildCount(); int mt_Lineno = 0; for (int i = 0; i < childCount; i++) { View child = getChildAt(i); measureChild(child, widthMeasureSpec, heightMeasureSpec); MarginLayoutParams childLayoutParams = (MarginLayoutParams) child.getLayoutParams(); int childMeasuredHeight = child.getMeasuredHeight() + childLayoutParams.bottomMargin + childLayoutParams.topMargin; int childMeasuredWidth = child.getMeasuredWidth() + childLayoutParams.leftMargin + childLayoutParams.rightMargin; int jno = (int) child.getTag(five); int icLino = jno/1000; if (mt_Lineno != icLino){// lineWidth + childMeasuredWidth > widthSpecSize) {//The line is full mt_Lineno = icLino; width = Math.max(lineWidth, childMeasuredWidth); height = lineHeight + height; lineWidth = childMeasuredWidth; lineHeight = childMeasuredWidth; } else { //record line info lineWidth = lineWidth + childMeasuredWidth; lineHeight = Math.max(lineHeight, childMeasuredHeight); } if (i == childCount - 1) { //The last one width = Math.max(width, lineWidth); height += lineHeight; } } // 2.set params setMeasuredDimension(widthSpecMode == MeasureSpec.EXACTLY ? widthSpecSize : width, heightSpecMode == MeasureSpec.EXACTLY ? heightSpecSize : height ); } public boolean checkGetItemIfOK(byte bchkITEM) { boolean cbretbv = false; if(bchkITEM == CHECKITEMGRA_CLIP){ if(checkGraClipItemNum() > 0) cbretbv = true; } if(bchkITEM == CHECKITEMGRA_GRANUM){ if(checkGraItemNum() > 0) cbretbv = true; } return cbretbv; } List<Integer> eachLineHeight = new ArrayList<>(); List<List<View>> allViews = new ArrayList<>(); @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // 1. record how many views each row and get max height of the row eachLineHeight.clear(); allViews.clear(); int childCount = getChildCount(); int lineWidth = 0; int lineHeight = 0; List<View> lineViews = new ArrayList<>(); int mt_Lineno = 0; for (int i = 0; i < childCount; i++) { View child = getChildAt(i); MarginLayoutParams layoutParams = (MarginLayoutParams) child.getLayoutParams(); int childMeasuredHeight = child.getMeasuredHeight() + layoutParams.bottomMargin + layoutParams.topMargin; int childMeasuredWidth = child.getMeasuredWidth() + layoutParams.leftMargin + layoutParams.rightMargin; int jno = (int) child.getTag(five); int icLino = jno/1000; if (mt_Lineno != icLino){// if (lineWidth + childMeasuredWidth > getWidth()) {//The line is full mt_Lineno = icLino; lineWidth = 0; eachLineHeight.add(lineHeight); allViews.add(lineViews); lineViews = new ArrayList<>(); }//The line is not full lineHeight = Math.max(lineHeight, childMeasuredHeight); lineWidth = lineWidth + childMeasuredWidth; lineViews.add(child); if (i == childCount - 1) {//The last one eachLineHeight.add(lineHeight); allViews.add(lineViews); } final int finalI = i; child.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mCallback != null) {// set callback int jno = (int) v.getTag(five); mCallback.onItemClick(finalI,jno); } } }); } int left = 0; int top = 0; for (int i = 0; i < allViews.size(); i++) { List<View> views = allViews.get(i); lineHeight = eachLineHeight.get(i); // 2. layout row for (int j = 0; j < views.size(); j++) { View child = views.get(j); if (child.getVisibility() == View.GONE) { continue; } MarginLayoutParams lp = (MarginLayoutParams) child .getLayoutParams(); //calc childView's left,top,right,bottom int lc = left + lp.leftMargin; int tc = top + lp.topMargin; int rc = lc + child.getMeasuredWidth(); int bc = tc + child.getMeasuredHeight(); child.layout(lc, tc, rc, bc); left += child.getMeasuredWidth() + lp.rightMargin + lp.leftMargin; Point point = new Point(); point.x = lc+xoffv; point.y = tc+yoffv; child.setTag(point); } top = top + lineHeight; left = 0; } } private float checkIfScaleOK(float forgScale,float moveScale) { float fmovScale = -1f; float curScale = scale * moveScale; if(curScale < minScale){ fmovScale = minScale/scale; }else if(curScale > maxScale){ fmovScale = maxScale/scale; }else{ fmovScale = moveScale; } return fmovScale; } /** * */ private void setMaxMinScale(){ float xScale, yScale; xScale = minimal / primaryW; yScale = minimal / primaryH; mcurScale = xScale > yScale ? xScale : yScale; minScale = (float)(mcurScale*0.5); scale = mcurScale; xScale = primaryW / screenW; yScale = primaryH / screenH; if (xScale > 1 || yScale > 1 ) { if (xScale > yScale) { maxScale = 1/xScale; }else { maxScale = 1/yScale; } }else { if (xScale > yScale) { maxScale = 1/xScale; }else { maxScale = 1/yScale; } } if(maxScale > 3) maxScale = 3; if(maxScale < 2f) maxScale = 2f; if(maxScale < minScale) maxScale = minScale*3; } private boolean graStatusCheck(MotionEvent event){ boolean cretblv = false; float moveX = event.getX(); float moveY = event.getY(); float moveDistanceX = moveX - mFirstX; float moveDistanceY = moveY - mFirstY; if(Math.abs(moveDistanceX) > miniShowWhv || Math.abs(moveDistanceY) > miniShowWhv) { if (Math.abs(moveDistanceX) > Math.abs(moveDistanceY)) { translationX = translationX + moveDistanceX; cretblv = true; }else{ translationY = translationY + moveDistanceY; cretblv = true; } } return cretblv; } private void isClickButtonRegion(){ mbuttonClickblv = false; if(mFirstX >= buttonDrawUtil.fcLeft && mFirstX <= buttonDrawUtil.fcRight){ if(mFirstY >= buttonDrawUtil.fcTop && mFirstY <= buttonDrawUtil.fcBottom){ mbuttonClickblv = true; } } } private boolean isClickDrawTextRegion(float fx,float fy){ boolean cretblv = false; if(fx >= mdrawtxt_markFRect.left && fx <= mdrawtxt_markFRect.right){ if(fy >= mdrawtxt_markFRect.top && fy <= mdrawtxt_markFRect.bottom){ cretblv = true; } } return cretblv; } private boolean isClickDrawRubberRegion(float fx,float fy){ boolean cretblv = false; if(mdrawMarkSymblv) { if (fx >= mdrawRubber_markFRect.left && fx <= mdrawRubber_markFRect.right) { if (fy >= mdrawRubber_markFRect.top && fy <= mdrawRubber_markFRect.bottom) { cretblv = true; } } } return cretblv; } /** * 判断手指是否点在图片内(单指) */ private void isClickInImage(){ boolean cnotButtonblv = true; mbuttonClickblv = false; if(mFirstX >= buttonDrawUtil.fcLeft && mFirstX <= buttonDrawUtil.fcRight){ if(mFirstY >= buttonDrawUtil.fcTop && mFirstY <= buttonDrawUtil.fcBottom){ cnotButtonblv = false; mbuttonClickblv = true; } } if(cnotButtonblv) { isClickInImage = true; if(buttonData.cActive_IDitem != buttonData.BUTTONIDNO_EMPTY){// edit picture isClickInImage = false; return; } }else { isClickInImage = false; } } /** 移动操作 */ private void movingAction(MotionEvent event){ float moveX = event.getX(); float moveY = event.getY(); if (lastMoveX == -1 || lastMoveY == -1) { lastMoveX = moveX; lastMoveY = moveY; } float moveDistanceX = moveX - lastMoveX; float moveDistanceY = moveY - lastMoveY; translationX = translationX + moveDistanceX; translationY = translationY + moveDistanceY; lastMoveX = moveX; lastMoveY = moveY; invalidate(); } public void setButtonWide(int ibwide) { mbuttonMoveWidth = ibwide; } /** 缩放操作 */ private void zoomAction(MotionEvent event){ midPoint(event); float currentDistance = getFingerDistance(event); if (Math.abs(currentDistance - fingerDistance) > 1f) { float moveScale = currentDistance / fingerDistance; //... float fcurScale = scale * moveScale; moveScale = checkIfScaleOK(scale,moveScale); if(moveScale > 0f){ scale = scale * moveScale; translationX = translationX * moveScale + centPointX * (1 - moveScale); translationY = translationY * moveScale + centPointY * (1 - moveScale); fingerDistance = currentDistance; invalidate(); } } } private void operIndicateSound() { Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); Ringtone r = RingtoneManager.getRingtone(mcontext, notification); r.play(); } private void touchUpOrCancel(MotionEvent event){ mPressBreak = true; mdrawClipRectblv = false; lastMoveX = -1; lastMoveY = -1; mLocker = 0; boolean curButtonClickblv = false; if(mbuttonClickblv && !mLongMoveblv && !mFingerNum2blv) curButtonClickblv = true; if(curButtonClickblv) { if (mLongClickblv == false) { mButtonUpTimev = System.currentTimeMillis(); long durationMs = mButtonUpTimev - mButtonDownTimev; if (durationMs > LONGPRESS_TIME) { mLongClickblv = true; } } if(mLongClickblv == false || !mLongClickButtonblv) { isSelectButton(event, mLongClickblv); } }else { if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_DRAGMOVE) { if(mdrawItemDelDragClickblv && mLongMoveblv && mLongClickblv){ mdrawItemDelDragClickblv = false; if (mgraItemHandle.confirmDragMoveItem()) { ; }; }; } if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_DELETE) { mstrTraceInfo = "DEL:"+String.valueOf(mdrawItemDelDragClickblv)+",Move:"+String.valueOf(mLongMoveblv)+",Click:"+String.valueOf(mLongClickblv);//xxxxxxxx if(mdrawItemDelDragClickblv && !mLongMoveblv && mLongClickblv){ mdrawItemDelDragClickblv = false; mstrTraceInfo = mstrTraceInfo +",PASS"; if (mgraItemHandle.confirmDeleteSelItem()) { ; }; }; } if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_TEXT) { boolean clickYesTxtblv = false; if(mdrawtxtClickblv && mLongClickblv && !mLongMoveblv){ clickYesTxtblv = isClickDrawTextRegion(event.getX(),event.getY()); if(clickYesTxtblv){ handle_NewGraphicsItem(buttonData.BUTTONIDNO_TEXT); invalidate(); } }; } if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_RUBBER) { boolean clickYesMarkblv = false; if(mdrawRubberClickblv && mLongClickblv && !mLongMoveblv){ clickYesMarkblv = isClickDrawRubberRegion(event.getX(),event.getY()); if(clickYesMarkblv){ handle_NewGraphicsItem(buttonData.BUTTONIDNO_RUBBER); invalidate(); } }; } if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_CLIP) { if(mselectClipOperblv){ mselectClipOperblv = false; handle_NewGraphicsItem(buttonData.BUTTONIDNO_CLIP); invalidate(); }else{ } } }; if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_CLIP){ mgraItemHandle.setClipSelRunStatus(true); }else{ mgraItemHandle.setClipSelRunStatus(false); } lastMoveX = -1; lastMoveY = -1; } private void graphicsModeMove(MotionEvent event) { // click button or draw graphics mTimeMove = System.currentTimeMillis(); if (mLongClickblv == false) { long durationMs = mTimeMove - mButtonDownTimev; if (durationMs > LONGPRESS_TIME) { mLongClickblv = true; } } if (mLongMoveblv == false) { float fxmove = Math.abs(event.getX() - mFirstX); float fymove = Math.abs(event.getY() - mFirstY); if (fxmove >= mbuttonMoveWidth || fymove >= mbuttonMoveWidth) { mLongMoveblv = true; } } if (mbuttonClickblv) {// click button area mstrTraceInfo = mstrTraceInfo+"button,";//xxxxxxxx if (mLongMoveblv) {// long move not click button if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_EMPTY) { float fingerNum = event.getPointerCount(); if (fingerNum == 1 && mLocker == 0) { movingAction(event); } else if (fingerNum == 2) { zoomAction(event); mFingerNum2blv = true; } } if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_CLIP) { mCliprect.right = (int) event.getX(); mCliprect.bottom = (int) event.getY(); if(Math.abs(mCliprect.right-mCliprect.right) > miniShowWhv && Math.abs(mCliprect.bottom-mCliprect.top) > miniShowWhv){ invalidate(); } } if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_TEXT) { mtxtshowXpos = (int) event.getX(); mtxtshowYpos = (int) event.getY(); mtxtShowblv = true; } if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_RUBBER) { if(mLongMoveblv) { if(mdrawDownPrimitiveblv){ mdrawFirstX = mFirstX; mdrawFirstY = mFirstY; } if(mbDrawKind == buttonData.MARKICONKIND_LINE){ if(mdrawDownPrimitiveblv && mPolyLineList.size() > 0){ mPolyLineList.clear(); } if(mPolyLineList.size() <= 0){ Point firstpnt = new Point((int)mFirstX,(int)mFirstY); mPolyLineList.add(firstpnt); Point secondpnt = new Point((int) event.getX(),(int) event.getY()); mPolyLineList.add(secondpnt); mdrawFirstX = event.getX(); mdrawFirstY = event.getY(); mFirstX = event.getX(); mFirstY = event.getY(); mLongMoveblv = false; }else{ Point secondpnt = new Point((int) event.getX(),(int) event.getY()); if(mPolyLineList.size() < 20) { mPolyLineList.add(secondpnt); mdrawFirstX = event.getX(); mdrawFirstY = event.getY(); mFirstX = event.getX(); mFirstY = event.getY(); mLongMoveblv = false; }else{ int indexpj = mPolyLineList.size()-1; mPolyLineList.set(indexpj,secondpnt); } } }else{ mSecondX = event.getX(); mSecondY = event.getY(); } mdrawShowblv = true; mdrawDownPrimitiveblv = false; } } }else{ if(mLongClickblv){// long press if(!mLongClickButtonblv) { mLongClickButtonblv = true; isSelectButton(event, true); } } } }else{// not click button float fingerNum = event.getPointerCount(); if (fingerNum == 1 && mLocker == 0) { if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_CLIP) { mCliprect.right = (int) event.getX(); mCliprect.bottom = (int) event.getY(); if(Math.abs(mCliprect.right-mCliprect.right) > miniShowWhv && Math.abs(mCliprect.bottom-mCliprect.top) > miniShowWhv){ invalidate(); } }; if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_TEXT) { boolean clickYesTxtblv = false; if(mdrawtxtClickblv && mLongClickblv && !mLongMoveblv){ clickYesTxtblv = isClickDrawTextRegion(event.getX(),event.getY()); if(clickYesTxtblv){ //???? handler.sendEmptyMessage(APPENDGRAPHICSITEM_TEXT); } }; if(!clickYesTxtblv) { if(!mdrawtxtClickblv || mLongMoveblv) { mtxtshowXpos = (int) event.getX(); mtxtshowYpos = (int) event.getY(); } mtxtShowblv = true; } } // delete if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_DELETE) { invalidate();//xxxxxxxxxx } // drag move if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_DRAGMOVE) { if(mdrawItemDelDragClickblv && mLongMoveblv){// && !mdraw_DragMoveLockblv){ mdraw_DragMoveLockblv = true; int ixOffv = (int)((event.getX() - mFirstX)/scale); int iyOffv = (int)((event.getY() - mFirstY)/scale); if(mondraw_Processblv == false){// &&(ixOffv != 0 || iyOffv != 0)) { if (mgraItemHandle.updateSetDragMovePara(ixOffv, iyOffv)) { mondraw_Processblv = true; handler.sendEmptyMessage(DRAGMOVEGRAITEM_REDRAW); } } mdraw_DragMoveLockblv = false; }else { } } // rubber if (buttonData.cActive_IDitem == buttonData.BUTTONIDNO_RUBBER) { boolean clickYesMarkblv = false; if(mdrawRubberClickblv && mLongClickblv && !mLongMoveblv){ clickYesMarkblv = isClickDrawRubberRegion(event.getX(),event.getY()); if(clickYesMarkblv){ //???? handler.sendEmptyMessage(APPENDGRAPHICSITEM_TEXT); } }; if(!clickYesMarkblv) { if(mLongMoveblv) { if(mdrawDownPrimitiveblv){ mdrawFirstX = mFirstX; mdrawFirstY = mFirstY; } if(mbDrawKind == buttonData.MARKICONKIND_LINE){ if(mdrawDownPrimitiveblv && mPolyLineList.size() > 0){ mPolyLineList.clear(); } if(mPolyLineList.size() <= 0){ Point firstpnt = new Point((int)mFirstX,(int)mFirstY); mPolyLineList.add(firstpnt); Point secondpnt = new Point((int) event.getX(),(int) event.getY()); mPolyLineList.add(secondpnt); mdrawFirstX = event.getX(); mdrawFirstY = event.getY(); mFirstX = event.getX(); mFirstY = event.getY(); mLongMoveblv = false; }else{ Point secondpnt = new Point((int) event.getX(),(int) event.getY()); if(mPolyLineList.size() < 20) { mPolyLineList.add(secondpnt); mdrawFirstX = event.getX(); mdrawFirstY = event.getY(); mFirstX = event.getX(); mFirstY = event.getY(); mLongMoveblv = false; }else{ int indexpj = mPolyLineList.size()-1; mPolyLineList.set(indexpj,secondpnt); } } }else{ mSecondX = event.getX(); mSecondY = event.getY(); } mdrawShowblv = true; mdrawDownPrimitiveblv = false; } } } } else if (fingerNum == 2) { mstrTraceInfo = mstrTraceInfo+",Zoom";//xxxxxxxx mFingerNum2blv = true; zoomAction(event); } } } private void isSelectButton(MotionEvent event,boolean isClickLongblv){ Point fdpoint = new Point(0,0); boolean cButtonblv = false; if(clickDownFirstblv){ fdpoint.x = (int)mFirstX; fdpoint.y = (int)mFirstY; cButtonblv = true; }else { if(event != null) { fdpoint.x = (int) event.getX(); fdpoint.y = (int) event.getY(); }else{ fdpoint.x = (int)mFirstX; fdpoint.y = (int)mFirstY; cButtonblv = true;; } } if(cButtonblv){ byte bClickKind = buttonData.BUTTONCLICK_SHORT; long ltimeSpace = mButtonUpTimev-mButtonDownTimev; if(ltimeSpace >= LONGPRESS_TIME || isClickLongblv){ bClickKind = buttonData.BUTTONCLICK_LONG; } byte selItemID = mButDrawMenuHandle.FindClickButtonItemIDno(fdpoint,bClickKind); if(selItemID != buttonData.BUTTONIDNO_EMPTY) { int ixoff = buttonDrawUtil.cbutRect.left; int iyoff = buttonDrawUtil.cbutRect.top-mbuttonMoveWidth*2; // restore if (selItemID == buttonData.BUTTONIDNO_RESTORE) { if (buttonDrawUtil.mButtonResetblv){// bClickKind == buttonData.BUTTONCLICK_LONG) { handler.sendEmptyMessage(PICTURERESTORE); } else { operIndicateSound(); mButtonCallback.onButtonClick(selItemID, ixoff, iyoff,false); } }else if(selItemID == buttonData.BUTTONIDNO_SAVE){ if (buttonDrawUtil.mButtonResetblv){ mButtonCallback.onButtonClick(selItemID, ixoff, iyoff,true); } else { operIndicateSound(); mButtonCallback.onButtonClick(selItemID, ixoff, iyoff,false); }; }else{ if(buttonDrawUtil.mButtonRedrawblv){ handler.sendEmptyMessage(PICTUREONDRAW); } if(buttonDrawUtil.mButtonResetblv){ mButtonCallback.onButtonClick(selItemID, ixoff, iyoff,true); }else{ if(buttonDrawUtil.mButtonInfoblv) { operIndicateSound(); mButtonCallback.onButtonClick(selItemID, ixoff, iyoff,false); }; } } } }else{ // mstrTraceInfo = mstrTraceInfo+">>gggg";//xxxxxx //... mButtonCallback.onButtonClick(buttonData.BUTTONIDNO_RESTORE,-1,-1);; } invalidate();//xxxxxxx } /** 判断手指是否点在图片内(双指) * 只要有一只手指在图片内就为true */ private void isClickInImage(MotionEvent event){ boolean cnotButtonblv = true; if(event.getX(0) >= buttonDrawUtil.fcLeft && event.getX(0) <= buttonDrawUtil.fcRight){ if(event.getY(0) >= buttonDrawUtil.fcTop && event.getY(0) <= buttonDrawUtil.fcBottom){ cnotButtonblv = false; mbuttonClickblv = true; } } if(cnotButtonblv){ if(event.getX(1) >= buttonDrawUtil.fcLeft && event.getX(1) <= buttonDrawUtil.fcRight){ if(event.getY(1) >= buttonDrawUtil.fcTop && event.getY(1) <= buttonDrawUtil.fcBottom){ cnotButtonblv = false; mbuttonClickblv = true; } }; } isClickInImage = cnotButtonblv;// true; if(buttonData.cActive_IDitem != buttonData.BUTTONIDNO_EMPTY){// edit picture isClickInImage = false; } } /** 获取两指间的距离 */ private float getFingerDistance(MotionEvent event){ float x = event.getX(1) - event.getX(0); float y = event.getY(1) - event.getY(0); return (float) Math.sqrt(x * x + y * y); } /** 获取两指间的中点坐标 */ private void midPoint(MotionEvent event){ centPointX = (event.getX(1) + event.getX(0))/2; centPointY = (event.getY(1) + event.getY(0))/2; } public int checkGraItemNum() { return mgraItemHandle.checkGetCurGraItem(); } public int checkGraClipItemNum() { return mgraItemHandle.checkGetCurGraClipItem(); } public String SaveEditPicture(boolean clipblv) { String curEditPicName = ""; if(saveEditImage(clipblv)){ mgraItemHandle.clearGraphicsItem(); curEditPicName = msaveEditPictureName; } return curEditPicName; } public String doExeClipEditPicture() { boolean clipblv = true; String curEditPicName = ""; if(clipEditPicture()){ mgraItemHandle.clearGraphicsItem(); curEditPicName = msaveEditPictureName; } return curEditPicName; } public String ConfirmGetEditPicture() { String curEditPicName = ""; if(yesGetEditPicture()){ mgraItemHandle.clearGraphicsItem(); curEditPicName = msaveEditPictureName; } return curEditPicName; } public String doExeSaveEditPicture() { String curEditPicName = ""; GraphicItemUtil.mcurMarkType = GraphicItemUtil.MARKTYPE_EMPTY; if(mgraItemHandle != null) { mButDrawMenuHandle.resetActiveButton(); } if(saveEditImage()){ mgraItemHandle.clearGraphicsItem(); curEditPicName = msaveEditPictureName; } return curEditPicName; } private boolean saveEditImage() { boolean cretblv = false; //创建一个bitmap,并放入画布。 Bitmap bitmap = Bitmap.createBitmap(mcur_photoBipmap.getWidth(), mcur_photoBipmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap);// mcur_photoBipmap); canvas.drawBitmap(mcur_photoBipmap, 0,0, null); if(mgraItemHandle.miItemActiveNum > 0){ GraphicItemUtil.FSCALE = 1; GraphicItemUtil.TRANSLATIONx = 0; GraphicItemUtil.TRANSLATIONy = 0; mgraItemHandle.GraphicsOnDraw(canvas); } // 保存绘制的内容 msaveEditPictureName = Environment.getExternalStorageDirectory() + "/"+m_pkName+"/20220916img.jpg";; File imgFile = new File(msaveEditPictureName); try { OutputStream os = new FileOutputStream(imgFile);//创建输出流 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);//通过输出流将图片保存 cretblv = true; } catch (FileNotFoundException e) { e.printStackTrace(); } return cretblv; } private boolean saveEditImage(boolean clipblv) { boolean cretblv = false; //创建一个bitmap,并放入画布。 Bitmap bitmap = Bitmap.createBitmap(mcur_photoBipmap.getWidth(), mcur_photoBipmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap);// mcur_photoBipmap); canvas.drawBitmap(mcur_photoBipmap, 0,0, null); if(mgraItemHandle.miItemActiveNum > 0){ GraphicItemUtil.FSCALE = 1; GraphicItemUtil.TRANSLATIONx = 0; GraphicItemUtil.TRANSLATIONy = 0; mgraItemHandle.GraphicsOnDraw(canvas); } // 保存绘制的内容 String FileTime = mcur_TIMEFILENAME;// "2022-09-24_13_02_26";//xxx timesdf.format(new Date()).toString();//获取系统时间 String mpicDatefileName = ""; msaveEditPictureName = m_EDITPICDIRName+"/eview_"+FileTime+".jpg"; if(clipblv){ mpicDatefileName = msaveEditPictureName; msaveEditPictureName = m_EDITPICDIRName+"/eview_CLIP20220922.jpg"; } File imgFile = new File(msaveEditPictureName); try { OutputStream os = new FileOutputStream(imgFile);//创建输出流 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);//通过输出流将图片保存 cretblv = true; } catch (FileNotFoundException e) { e.printStackTrace(); } if(cretblv){ Rect mclipRect = mgraItemHandle.getOndrawClipRect(); byte clipKind = mgraItemHandle.getOndrawClipKind(); Bitmap cbmp = null; if(clipKind == buttonData.CLIPAREAKIND_RECT) { cbmp = BitMapUtil.ImageCropWithClipRect(bitmap, mclipRect); } if(clipKind == buttonData.CLIPAREAKIND_OVAL) { cbmp = BitMapUtil.ImageClipWithOval(bitmap, mclipRect); } if (cbmp != null && mpicDatefileName.length() > 0) { msaveEditPictureName = mpicDatefileName; File img2File = new File(msaveEditPictureName); cretblv = false; if(clipKind == buttonData.CLIPAREAKIND_RECT) { try { OutputStream os = new FileOutputStream(img2File);//创建输出流 cbmp.compress(Bitmap.CompressFormat.JPEG, 100, os);//通过输出流将图片保存 cretblv = true; } catch (FileNotFoundException e) { e.printStackTrace(); } } if(clipKind == buttonData.CLIPAREAKIND_OVAL) { try { OutputStream os = new FileOutputStream(img2File);//创建输出流 cbmp.compress(Bitmap.CompressFormat.PNG, 100, os);//通过输出流将图片保存 cretblv = true; } catch (FileNotFoundException e) { e.printStackTrace(); } } } } return cretblv; } public String getTraceInfo() { return mstrTraceInfo; } private boolean clipEditPicture() { boolean cretblv = false; //创建一个bitmap,并放入画布。 Bitmap bitmap = Bitmap.createBitmap(mcur_photoBipmap.getWidth(), mcur_photoBipmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap);// mcur_photoBipmap); canvas.drawBitmap(mcur_photoBipmap, 0,0, null); if(mgraItemHandle.miItemActiveNum > 0){ GraphicItemUtil.FSCALE = 1; GraphicItemUtil.TRANSLATIONx = 0; GraphicItemUtil.TRANSLATIONy = 0; mgraItemHandle.GraphicsOnDraw(canvas); } // 保存绘制的内容 String FileTime = "CLIPIMAGE2022929AB"; String mpicDatefileName = ""; msaveEditPictureName = m_EDITPICDIRName+"/eview_"+FileTime+".jpg"; mpicDatefileName = msaveEditPictureName; msaveEditPictureName = m_EDITPICDIRName+"/eview_CLIP20220922.jpg"; File imgFile = new File(msaveEditPictureName); try { OutputStream os = new FileOutputStream(imgFile);//创建输出流 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);//通过输出流将图片保存 cretblv = true; } catch (FileNotFoundException e) { e.printStackTrace(); } if(cretblv){ Rect mclipRect = mgraItemHandle.getOndrawClipRect(); byte clipKind = mgraItemHandle.getOndrawClipKind(); Bitmap cbmp = null; if(clipKind == buttonData.CLIPAREAKIND_RECT) { cbmp = BitMapUtil.ImageCropWithClipRect(bitmap, mclipRect); } if(clipKind == buttonData.CLIPAREAKIND_OVAL) { cbmp = BitMapUtil.ImageClipWithOval(bitmap, mclipRect); } if (cbmp != null && mpicDatefileName.length() > 0) { msaveEditPictureName = mpicDatefileName; File img2File = new File(msaveEditPictureName); cretblv = false; if(clipKind == buttonData.CLIPAREAKIND_RECT) { try { OutputStream os = new FileOutputStream(img2File);//创建输出流 cbmp.compress(Bitmap.CompressFormat.JPEG, 100, os);//通过输出流将图片保存 cretblv = true; } catch (FileNotFoundException e) { e.printStackTrace(); } } if(clipKind == buttonData.CLIPAREAKIND_OVAL) { try { OutputStream os = new FileOutputStream(img2File);//创建输出流 cbmp.compress(Bitmap.CompressFormat.PNG, 100, os);//通过输出流将图片保存 cretblv = true; } catch (FileNotFoundException e) { e.printStackTrace(); } } } } return cretblv; } private boolean yesGetEditPicture() { boolean cretblv = false; //创建一个bitmap,并放入画布。 Bitmap bitmap = Bitmap.createBitmap(mcur_photoBipmap.getWidth(), mcur_photoBipmap.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap);// mcur_photoBipmap); canvas.drawBitmap(mcur_photoBipmap, 0,0, null); if(mgraItemHandle.miItemActiveNum > 0){ GraphicItemUtil.FSCALE = 1; GraphicItemUtil.TRANSLATIONx = 0; GraphicItemUtil.TRANSLATIONy = 0; mgraItemHandle.GraphicsOnDraw(canvas); } // 保存绘制的内容 String FileTime = "GETIMAGE2022929AB"; msaveEditPictureName = m_EDITPICDIRName+"/eview_"+FileTime+".jpg"; File imgFile = new File(msaveEditPictureName); try { OutputStream os = new FileOutputStream(imgFile);//创建输出流 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);//通过输出流将图片保存 cretblv = true; } catch (FileNotFoundException e) { e.printStackTrace(); } return cretblv; } // about callback Callback mCallback; buttonCallback mButtonCallback; public void setOnItemClickCallback(Callback callback) { mCallback = callback; } public void setOnButtonClickCallback(buttonCallback callback) { mButtonCallback = callback; } public void setItemContent(int position, String content) { if (getChildAt(position) instanceof TextView) { TextView tv = (TextView) getChildAt(position); tv.setText(content); tv.requestLayout(); } } public String GetTaskParaLst() { String strTaskpar = ""; int childCount = getChildCount(); int icparn = 0; for (int i = 0; i < childCount; i++) { View child = getChildAt(i); int jno = (int) child.getTag(five); int icLino = jno/1000; int iparkind = jno % 100; if(iparkind == 2){// editText EditText edtxt = (EditText) getChildAt(i); if(icparn > 0){ strTaskpar = strTaskpar+":>"; } String curTaskpar = edtxt.getText().toString(); if(curTaskpar.length() <= 0) curTaskpar = "__"; strTaskpar = strTaskpar+curTaskpar; icparn++; } } return strTaskpar; } public Bitmap getCurPhotoBitmap() { return mcur_photoBipmap; } public void updateSetPhotoBitmap(Bitmap cbitmap) { mcur_photoBipmap = cbitmap; cnewPhotoblv = false; isLoaded = true; primaryW = mcur_photoBipmap.getWidth(); primaryH = mcur_photoBipmap.getHeight(); GraphicItemUtil.bmpLEFT = 0; GraphicItemUtil.bmpTOP = 0; GraphicItemUtil.bmpRIGHT = (int)primaryW; GraphicItemUtil.bmpBOTTOM = (int)primaryH; miBitmapfXc = primaryW/2; miBitmapfYc = primaryH/2; matrix = new Matrix(); } public void dataShowSet(boolean showblv) { int childCount = getChildCount(); int icparn = 0; bdataShowblv = showblv; cnewPhotoblv = false; for (int i = 0; i < childCount; i++) { View child = getChildAt(i); if(showblv){ child.setVisibility(View.VISIBLE); }else{ child.setVisibility(View.INVISIBLE); } } } public String getItemContent(int position) { String content = ""; if (getChildAt(position) instanceof TextView) { TextView tv = (TextView) getChildAt(position); content = tv.getText().toString(); } return content; } public boolean removeItem(int position) { boolean success = false; if (getChildAt(position) != null) { removeView(getChildAt(position)); success = true; } return success; } public interface Callback { void onItemClick(int position, int jno); } public interface buttonCallback { void onButtonClick(byte buttonIDno, int ixoff,int iyoff,boolean doOper); } // about view drag @Override public boolean onInterceptTouchEvent(MotionEvent ev) { if (mDragEnable) { return mViewDragHelper.shouldInterceptTouchEvent(ev); } return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { if (isLoaded == true && bdataShowblv == false){ switch (event.getActionMasked()){ case MotionEvent.ACTION_DOWN: lastMoveX = -1; lastMoveY = -1; mdrawClipRectblv = false; mselectClipOperblv = false; mFirstX = event.getX(); mFirstY = event.getY(); downX = event.getRawX(); downY = event.getRawY(); mButtonDownTimev = System.currentTimeMillis(); isClickButtonRegion(); mdrawItemDelDragClickblv = false; if(GraphicItemUtil.mcurMarkType != GraphicItemUtil.MARKTYPE_EMPTY){ mdraw_DragMoveLockblv = false; mdrawItemDelDragClickblv = mgraItemHandle.findMarkDrawItem(mFirstX,mFirstY); } clickDownFirstblv = true; isLongClick = false; mLongClickblv = false; mLongMoveblv = false; mtxtShowblv = false; mdrawShowblv = false; mdrawtxtClickblv = false; mdrawRubberClickblv = false; mdrawDownPrimitiveblv = true; if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_CLIP){// && !mbuttonClickblv) { mdrawClipRectblv = true; mCliprect.right+=StrokeWidth; mCliprect.bottom+=StrokeWidth; GraphicItemUtil.mClipSelsetRunblv = true; invalidate(mCliprect); mCliprect.left = (int)mFirstX; mCliprect.top = (int)mFirstY; mCliprect.right =mCliprect.left; mCliprect.bottom = mCliprect.top; } if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_TEXT){ mdrawtxtClickblv = isClickDrawTextRegion(mFirstX,mFirstY); } if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_RUBBER){ mdrawRubberClickblv = isClickDrawRubberRegion(mFirstX,mFirstY); if(!mdrawRubberClickblv && mbDrawKind == buttonData.MARKICONKIND_LINE) { mPolyLineList.clear(); } if(mdrawRubberClickblv){ mdrawFirstPreX = mdrawFirstX; mdrawFirstPreY = mdrawFirstY; mdrawShowblv = true; } } mPressBreak = false; mFingerNum2blv = false; mLongClickButtonblv = false; if(mlongThreadProcessCode == 0) { mlongThreadProcessCode = 1; LongClickCheckThread startWait = new LongClickCheckThread(handler, "12345", DOWNLONGCLICKCHECK, (int) 1600); Thread thread = new Thread(startWait, "BusyWait61"); thread.start(); }else{ mlongThreadProcessCode = 9; } mLocker = 0;// new add ???? break; case MotionEvent.ACTION_POINTER_DOWN: mButtonDownTimev = System.currentTimeMillis(); fingerDistance = getFingerDistance(event); clickDownFirstblv = false; mFingerNum2blv = false; mLongClickButtonblv = false; mLongClickblv = false; mLongMoveblv = false; mtxtShowblv = false; mdrawShowblv = false; mLocker = 0;// new add ???? if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_RUBBER){ if(!mdrawRubberClickblv) { mPolyLineList.clear(); } } break; case MotionEvent.ACTION_MOVE: if(mbuttonClickblv == false && buttonData.cActive_IDitem == buttonData.BUTTONIDNO_EMPTY){ float fingerNum = event.getPointerCount(); if (fingerNum == 1 && mLocker == 0) { movingAction(event); } else if (fingerNum == 2) { mFingerNum2blv = true; zoomAction(event); }; }else { if(mFingerNum2blv == false) { graphicsModeMove(event); invalidate(); }else{ float fingerNum = event.getPointerCount(); if (fingerNum == 2) { zoomAction(event); } } } break; case MotionEvent.ACTION_POINTER_UP: if(GraphicItemUtil.mClipSelsetRunblv){ GraphicItemUtil.mClipSelsetRunblv = false; } mPressBreak = true; mLocker = 1;// ???? break; case MotionEvent.ACTION_UP: if(!mPressBreak){ mPressBreak = true; touchUpOrCancel(event); } break; case MotionEvent.ACTION_CANCEL: if(mPressBreak == false){ mPressBreak = true; touchUpOrCancel(event); } break; } return true; }else { if (mDragEnable) { mViewDragHelper.processTouchEvent(event); return true; } } return super.onTouchEvent(event); } private void draw_TextItem(Canvas canvas) { // select confirm mark button mPaint.setColor(Color.WHITE); mPaint.setStyle(Paint.Style.FILL); RectF rectF = new RectF(); rectF.left = mtxtshowXpos-mgraItem_MarkWide/2; rectF.right = mtxtshowXpos+mgraItem_MarkWide/2; rectF.top = mtxtshowYpos-mgraItem_MarkWide/2; rectF.bottom = mtxtshowYpos+mgraItem_MarkWide/2; canvas.drawOval(rectF, mPaint); mdrawtxt_markFRect = rectF; Path sympath = PathParser.doPath(COMCONST.GRAITEM_SELECTITEM); Matrix cmaxtrix = new Matrix(); cmaxtrix.setScale(mgraItem_MarkFscale, mgraItem_MarkFscale); sympath.transform(cmaxtrix); sympath.offset(rectF.left+mgraItem_Xoff, rectF.top+mgraItem_Yoff); mPaint.setStrokeWidth(2); //.. paint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.RED); canvas.drawPath(sympath, mPaint); int icfntsize = (int)(miTextSize*scale); // if(mbTextKind == buttonData.TEXTICONKIND_HORIZONTAL){ mPaint.setColor(miTextColorv); mPaint.setTextSize(icfntsize); mPaint.setStyle(Paint.Style.FILL); canvas.drawText(mstrMarkname,mtxtshowXpos,mtxtshowYpos,mPaint);; } if(mbTextKind == buttonData.TEXTICONKIND_VERTICAL){ GraphicsExpItem.drawVertical2Text(canvas,mstrMarkname,miTextColorv,icfntsize,mtxtshowXpos,mtxtshowYpos);; } if(mbTextKind == buttonData.TEXTICONKIND_ARC){ GraphicsExpItem.drawTextOnArc(canvas,mstrMarkname,miTextColorv,icfntsize,mtxtshowXpos,mtxtshowYpos);; } } private void draw_MarkItem(Canvas canvas) { float fxpos = (mdrawFirstX+mSecondX)/2; float fypos = (mdrawFirstY+mSecondY)/2; int iRed = Color.red(miDrawColorv); int iGreen = Color.green(miDrawColorv); int iBlue = Color.blue(miDrawColorv); int curDrawColorv = Color.argb(miTransparentValue,iRed,iGreen,iBlue); if(mbDrawKind == buttonData.MARKICONKIND_LINE){ if(mPolyLineList.size() >= 2){ Path polyLinepath = new Path(); fxpos = mPolyLineList.get(0).x; fypos = mPolyLineList.get(0).y; polyLinepath.moveTo(mPolyLineList.get(0).x,mPolyLineList.get(0).y); for(int jp = 1;jp < mPolyLineList.size();jp++){ polyLinepath.lineTo(mPolyLineList.get(jp).x,mPolyLineList.get(jp).y); } Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setAntiAlias(true); // 去锯齿 paint.setColor(curDrawColorv);// miDrawColorv); paint.setStrokeWidth(miLinewide*scale); canvas.drawPath(polyLinepath, paint); } } if(mbDrawKind == buttonData.MARKICONKIND_OVAL){ float fLeft = mdrawFirstX; float fRight = mSecondX; if(fLeft > fRight){ fLeft = mSecondX; fRight = mdrawFirstX;; } float fTop = mdrawFirstY; float fBottom = mSecondY; if(fTop > fBottom){ fTop = mSecondY; fBottom = mdrawFirstY; } RectF rectF = new RectF(fLeft, fTop,fRight,fBottom); Path drawpath = new Path(); drawpath.addOval(rectF, Path.Direction.CCW); Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setAntiAlias(true); // 去锯齿 paint.setColor(curDrawColorv);// miDrawColorv); paint.setStrokeWidth(miLinewide*scale); canvas.drawPath(drawpath, paint); } if(mbDrawKind == buttonData.MARKICONKIND_SOLIDOVAL){ float fLeft = mdrawFirstX; float fRight = mSecondX; if(fLeft > fRight){ fLeft = mSecondX; fRight = mdrawFirstX;; } float fTop = mdrawFirstY; float fBottom = mSecondY; if(fTop > fBottom){ fTop = mSecondY; fBottom = mdrawFirstY; } RectF rectF = new RectF(fLeft, fTop,fRight,fBottom); Path drawpath = new Path(); drawpath.addOval(rectF, Path.Direction.CCW); Paint paint = new Paint(); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); // 去锯齿 paint.setColor(curDrawColorv);// miDrawColorv); //... paint.setStrokeWidth(miLinewide); canvas.drawPath(drawpath, paint); } if(mbDrawKind == buttonData.MARKICONKIND_ARROW){ int icLinewd = (int)(miLinewide*scale); GraphicsExpItem.drawARROW(canvas,(int)mdrawFirstX, (int)mdrawFirstY,(int)mSecondX,(int)mSecondY,curDrawColorv,icLinewd); } // draw select flag mPaint.setColor(Color.WHITE); mPaint.setStyle(Paint.Style.FILL); RectF rectF0 = new RectF(); rectF0.left = fxpos-mgraItem_MarkWide/2; rectF0.right = fxpos+mgraItem_MarkWide/2; rectF0.top = fypos-mgraItem_MarkWide/2; rectF0.bottom = fypos+mgraItem_MarkWide/2; canvas.drawOval(rectF0, mPaint); mdrawRubber_markFRect = rectF0; Path sympath = PathParser.doPath(COMCONST.GRAITEM_SELECTITEM); Matrix cmaxtrix = new Matrix(); cmaxtrix.setScale(mgraItem_MarkFscale, mgraItem_MarkFscale); sympath.transform(cmaxtrix); sympath.offset(rectF0.left+mgraItem_Xoff, rectF0.top+mgraItem_Yoff); mPaint.setStrokeWidth(2); //.. paint.setStyle(Paint.Style.FILL); mPaint.setColor(Color.RED); canvas.drawPath(sympath, mPaint); mdrawMarkSymblv = true; } public void setGraphicsItemMarkPara(float fscale,float fwide,int ixoff,int iyoff) { mgraItem_MarkFscale = fscale; mgraItem_MarkWide = fwide; mgraItem_Xoff = ixoff; mgraItem_Yoff = iyoff; } private void draw_ClipFocusItem(Canvas canvas) { RectF rectF = new RectF(); rectF.top = mCliprect.top; rectF.left = mCliprect.left; rectF.bottom = mCliprect.bottom; rectF.right = mCliprect.right; if(mCliprect.top > mCliprect.bottom){ rectF.bottom = mCliprect.top; rectF.top = mCliprect.bottom; } if(mCliprect.left > mCliprect.right){ rectF.right = mCliprect.left; rectF.left = mCliprect.right; } mdrawClipRectF = rectF; if(mdrawClipRectF.width() >= miniShowWhv && mdrawClipRectF.height() >= miniShowWhv) { Path clipRectpath = new Path(); RectF outRect = new RectF(0, 0, drawScreenW, drawScreenH); clipRectpath.addRect(outRect, Path.Direction.CCW); if (mbClipAreaKind == buttonData.CLIPAREAKIND_RECT) { clipRectpath.addRect(rectF, Path.Direction.CW); } if (mbClipAreaKind == buttonData.CLIPAREAKIND_OVAL) { clipRectpath.addOval(rectF, Path.Direction.CW); } int iRed = Color.red(iClipColorv); int iGreen = Color.green(iClipColorv); int iBlue = Color.blue(iClipColorv); mPaint.setColor(Color.argb(mcurClipAlpha,iRed,iGreen,iBlue));//... colorSelectorView.getColorAddAlpha(iClipColorv,192)); mPaint.setStyle(Paint.Style.FILL); canvas.drawPath(clipRectpath, mPaint); mselectClipOperblv = true; }else{ mselectClipOperblv = false; } } class LongClickCheckThread implements Runnable { Handler mTHandler; String waitNo; int iWHATval = -1; int iWaitMilliSecond = 1000; public LongClickCheckThread(Handler handler,String waitName,int iWhatv,int iWaitTimems) { this.mTHandler = handler; this.waitNo = waitName; this.iWHATval = iWhatv; this.iWaitMilliSecond = iWaitTimems; if(iWaitTimems < 120) this.iWaitMilliSecond = iWaitTimems*1000; } @Override public void run() { synchronized (waitNo) { try { Thread.sleep(iWaitMilliSecond);// 1.5 second } catch (InterruptedException e) { e.printStackTrace(); } mlongThreadProcessCode++; Message msg = new Message(); msg.what = iWHATval; msg.obj = waitNo; handler.sendMessage(msg); } }; } /** * 震动 */ /* private void vibrate() { if (!isLongClick) { Vibrator vibrator = (Vibrator) this.getSystemService(this.VIBRATOR_SERVICE); vibrator.vibrate(100); } } */ @Override public void computeScroll() { if (mViewDragHelper.continueSettling(true)) { invalidate(); } } @Override protected void onFinishInflate() { super.onFinishInflate(); } @NonNull private ViewDragHelper.Callback createDrawCallback() { return new ViewDragHelper.Callback() { @Override public boolean tryCaptureView(View child, int pointerId) { return true; } @Override public int clampViewPositionHorizontal(View child, int left, int dx) { //range int leftBound = getPaddingLeft(); int rightBound = getWidth() - child.getWidth() - getPaddingRight(); left = Math.min(Math.max(left, leftBound), rightBound); return left; } @Override public int clampViewPositionVertical(View child, int top, int dy) { //range int topBound = getPaddingTop(); int bottomBound = getHeight() - child.getHeight() - getPaddingBottom(); top = Math.min(Math.max(topBound, top), bottomBound); return top; } @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { if (releasedChild instanceof TextView) { Point point = (Point) releasedChild.getTag(); int jno = (int) releasedChild.getTag(five); if (jno != 10) { mViewDragHelper.settleCapturedViewAt(point.x, point.y); } } if (releasedChild instanceof ImageView) { /* if (releasedChild == iv_image) { mViewDragHelper.settleCapturedViewAt(mAutoBackOriginPos.x, mAutoBackOriginPos.y);; } */ } invalidate(); } // solve children onclick public int getViewHorizontalDragRange(View child) { return child.getWidth(); } public int getViewVerticalDragRange(View child) { return child.getHeight(); } }; } public boolean isDragEnable() { return mDragEnable; } public void setDragEnable(boolean dragEnable) { mDragEnable = dragEnable; } }
三,关联java类的代码
在自定RelativeLayout中,专门设计了“操作按钮类”(buttonData,buttonDrawUtil)与“图形项目类”(GraphicItemUtil,GraphicsExpItem)
1),操作按钮类
package com.bi3eview.newstart60.local.Util; import android.graphics.Color; import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; import java.io.Serializable; /** * Created by bs60 on 2022.08.06 */ public class buttonData implements Serializable{ public static int fillColor = Color.WHITE; public static int sideColor = Color.BLUE; public static int nameColor = Color.BLACK; public static int iconColor = Color.DKGRAY; public static int activeColor = Color.RED; public static int vecLinewd = 2; public static int sideWide = 2; public static int activeSideWide = 4; public static int cornRadius = 10; public static int buttonHeight = 46; public static int itxtsize; // click public final static byte BUTTONCLICK_SHORT = 1; public final static byte BUTTONCLICK_LONG = 2; // clip kind public final static byte CLIPAREAKIND_EMPTY = 0; public final static byte CLIPAREAKIND_RECT = 1; public final static byte CLIPAREAKIND_OVAL = 2; // text kind public final static byte COMMONKIND_EMPTY = 0; public final static byte TEXTICONKIND_HORIZONTAL = 21; public final static byte TEXTICONKIND_VERTICAL = 22; public final static byte TEXTICONKIND_ARC = 23; // mark public final static byte MARKICONKIND_LINE = 51; public final static byte MARKICONKIND_OVAL = 53; public final static byte MARKICONKIND_SOLIDOVAL = 63; public final static byte MARKICONKIND_ARROW = 54; // kind public final static byte BUTTONKIND_EMPTY = 1; public final static byte BUTTONKIND_RECT = 1; public final static byte BUTTONKIND_ROUNDRECT = 2; public final static byte BUTTONKIND_CIRCLE = 3; public final static byte BUTTONKIND_OVAL = 4; // status public final static byte BUTTONSTATUS_NORMAL = 1; public final static byte BUTTONSTATUS_ACTIVE = 2; public final static byte BUTTONSTATUS_HIDE = 3; // button Identify public final static byte BUTTONIDNO_EMPTY = 0; public final static byte BUTTONIDNO_REDRAW = 66; public final static byte BUTTONIDNO_RESTORE = 1; public final static byte BUTTONIDNO_RUBBER = 2; public final static byte BUTTONIDNO_CLIP = 3; public final static byte BUTTONIDNO_TEXT = 4; public final static byte BUTTONIDNO_PARASET = 5; public final static byte BUTTONIDNO_SAVE = 6; public final static byte BUTTONIDNO_SPOTLIGHT = 9; public final static byte BUTTONIDNO_DRAGMOVE = 8; public final static byte BUTTONIDNO_SAVE_REINFO = 67; public final static byte BUTTONIDNO_DELETE = 7; public final static byte BUTTONIDNO_UNDO = 68; public final static byte BUTTONIDNO_VERIFYCLIP = 101; // button shape public final static byte BUTTONSHAPE_EMPTY = 0; public final static byte BUTTONSHAPE_PATH = 1; public final static byte BUTTONSHAPE_BITMAP = 2; public final static byte BUTTONSHAPE_DRAW = 3; public static byte cActive_IDitem = BUTTONIDNO_EMPTY; // data private byte bkind,cstatus,buttonIDno,bshape; private int iLeft,iTop,iRight,iBottom; private int iXoff,iYoff,colorv; private String titleName; private String strShapePath; private float scale; // create button public buttonData(){ bkind = BUTTONKIND_RECT; cstatus = BUTTONSTATUS_NORMAL; bshape = BUTTONSHAPE_EMPTY; titleName = "BUTTON"; iLeft = 10; iTop = 10; iRight = 100; iBottom = iLeft+buttonHeight; strShapePath = ""; scale = 1.0f; iXoff = 0; iYoff = 0; colorv = Color.RED; } public void setButtonData(byte ckindb,byte buttonID,String name,int bLeft,int bTop,int bRight,int bBottom){ bkind = ckindb; buttonIDno = buttonID; titleName = name; iLeft = bLeft; iTop = bTop; iRight = bRight; iBottom = bBottom; }; public void setButtonPath(byte ckindb,byte buttonID,String name,int bLeft,int bTop,int bRight,int bBottom,float fscale,String butShapepath,int xmoffv,int ymoffv,int icolor){ bkind = ckindb; buttonIDno = buttonID; bshape = BUTTONSHAPE_PATH; titleName = name; iLeft = bLeft; iTop = bTop; iRight = bRight; iBottom = bBottom; strShapePath = butShapepath; scale = fscale; iXoff = xmoffv; iYoff = ymoffv; colorv = icolor; }; public void updateButtonStatus(byte setStatus){ cstatus = setStatus;}; // get public byte getButtonKind(){ return bkind;} public byte getButtonStatus(){ return cstatus;} public byte getButtonShape(){ return bshape;} public byte getButtonIDno(){ return buttonIDno;} public String getButtonName(){ return titleName;} public String getButtonPath(){ return strShapePath;} public float getButtonPathScale(){ return scale;} public int getButtonColor(){ return colorv;} public Point getButtonPathXYoff(){ Point point = new Point(iXoff,iYoff); return point; } public Rect getButtonRect(){ Rect rect = new Rect(); rect.left = iLeft; rect.top = iTop; rect.right = iRight; rect.bottom = iBottom; return rect; } public RectF getButtonRectF(){ RectF rectF = new RectF(); rectF.left = iLeft; rectF.top = iTop; rectF.right = iRight; rectF.bottom = iBottom; return rectF; } } //----------------------------------------------------------------------------- package com.bi3eview.newstart60.local.Util; import android.graphics.Matrix; import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Canvas; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Paint.FontMetricsInt; import com.bi3eview.newstart60.local.SelfWidget.PathParser; import java.util.ArrayList; /** * Created by bs60 on 2022.08.06 */ public class buttonDrawUtil { public static float fcLeft = 10f; public static float fcTop = 10f; public static float fcRight = 160f; public static float fcBottom = 60f; public static float CLICK_DISTANCE = 15f; public static Rect cbutRect = new Rect(0,0,20,20); public static boolean mButtonInfoblv = false; public static boolean mButtonResetblv = false; public static boolean mButtonRedrawblv = false; public static Bitmap mSpotLightBmp = null; public static Bitmap mDragMoveBmp = null; private int mcurActiveItemosj = -1; private ArrayList<buttonData> mDaItemList = null; Paint paint = null; public buttonDrawUtil(){ mDaItemList = new ArrayList(); paint = new Paint(); mcurActiveItemosj = -1; } public void appendButtonItem(buttonData cbutData) { if(mDaItemList != null){ mDaItemList.add(cbutData); } }; public void checkResetButtonShow(int icItemposj,int igraOknum) { if(mDaItemList.size() > 0){ for(int j = 0;j < mDaItemList.size();j++){ // save if(mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_SAVE){ if(mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_HIDE){ if(igraOknum > 0){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); } }else{ if(igraOknum == 0){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_HIDE); }; } }; // parameter set if(mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_PARASET){ boolean showblv = false; if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_CLIP) showblv = true; if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_TEXT) showblv = true; if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_RUBBER) showblv = true; if(showblv){// buttonData.cActive_IDitem != buttonData.BUTTONIDNO_EMPTY){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); }else{ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_HIDE); } }; // delete if(mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_DELETE){ if(mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_HIDE){ if(igraOknum > 0){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); } }else{ if(igraOknum == 0){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_HIDE); }; } }; // drag move if(mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_DRAGMOVE){ if(mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_HIDE){ if(igraOknum > 0){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); } }else{ if(igraOknum == 0){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_HIDE); }; } }; // undo if(mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_UNDO){ if(mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_HIDE){ if(icItemposj >= 0){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); } }else{ if(icItemposj < 0){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_HIDE); }; } }; } } } public byte FindClickButtonItemIDno(Point fdpoint,byte bClcikCode) { byte bretItemIDcd = buttonData.BUTTONIDNO_EMPTY; int inewActiveposj = -1; mButtonInfoblv = false; mButtonResetblv = false; mButtonRedrawblv = false; byte EXEOPERCODE = buttonData.BUTTONCLICK_SHORT; if(mDaItemList.size() > 0){ for(int j = 0;j < mDaItemList.size();j++) { if (mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_HIDE) continue; Rect rect = mDaItemList.get(j).getButtonRect(); if (fdpoint.x <= rect.left) continue; if (fdpoint.x >= rect.right) continue; if (fdpoint.y <= rect.top) continue; if (fdpoint.y >= rect.bottom) continue; // rubber if (mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_RUBBER) { if (mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_ACTIVE) { if (bClcikCode == EXEOPERCODE) { mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; mcurActiveItemosj = -1; mButtonRedrawblv = true; mButtonResetblv = true; } else { mButtonInfoblv = true; } } else { if (bClcikCode == EXEOPERCODE) { inewActiveposj = j; mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_ACTIVE); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_RUBBER; mButtonRedrawblv = true; mButtonResetblv = true; mcurActiveItemosj = j; }else{ mButtonInfoblv = true; } } bretItemIDcd = buttonData.BUTTONIDNO_RUBBER; } // clip if (mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_CLIP) { if (mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_ACTIVE) { if (bClcikCode == EXEOPERCODE) { mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; mButtonRedrawblv = true; mButtonResetblv = true; mcurActiveItemosj = -1; }else{ mButtonInfoblv = true; } } else { if (bClcikCode == EXEOPERCODE) { inewActiveposj = j; mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_ACTIVE); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_CLIP; mButtonRedrawblv = true; mButtonResetblv = true; mcurActiveItemosj = j; }else{ mButtonInfoblv = true; } } bretItemIDcd = buttonData.BUTTONIDNO_CLIP; } // text if (mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_TEXT) { if (mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_ACTIVE) { if (bClcikCode == EXEOPERCODE) { mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; mButtonRedrawblv = true; mButtonResetblv = true; mcurActiveItemosj = -1; }else{ mButtonInfoblv = true; } } else { if (bClcikCode == EXEOPERCODE) { inewActiveposj = j; mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_ACTIVE); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_TEXT; mButtonRedrawblv = true; mButtonResetblv = true; mcurActiveItemosj = j; }else{ mButtonInfoblv = true; } } bretItemIDcd = buttonData.BUTTONIDNO_TEXT; } // save if (mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_SAVE) { if (bClcikCode == EXEOPERCODE) { mButtonResetblv = true; }else{ mButtonInfoblv = true; } bretItemIDcd = buttonData.BUTTONIDNO_SAVE; } // parameter set if (mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_PARASET) { if (bClcikCode == EXEOPERCODE) { mButtonResetblv = true; }else{ mButtonInfoblv = true; } bretItemIDcd = buttonData.BUTTONIDNO_PARASET; } // delete if (mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_DELETE) { if (mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_ACTIVE) { if (bClcikCode == EXEOPERCODE) { mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; mButtonRedrawblv = true; mButtonResetblv = true; mcurActiveItemosj = -1; }else{ mButtonInfoblv = true; } } else { if (bClcikCode == EXEOPERCODE) { inewActiveposj = j; mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_ACTIVE); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_DELETE; mButtonRedrawblv = true; mButtonResetblv = true; mcurActiveItemosj = j; }else{ mButtonInfoblv = true; } } bretItemIDcd = buttonData.BUTTONIDNO_DELETE; } // drag move if (mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_DRAGMOVE) { if (mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_ACTIVE) { if (bClcikCode == EXEOPERCODE) { mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_EMPTY; mButtonRedrawblv = true; mButtonResetblv = true; mcurActiveItemosj = -1; }else{ mButtonInfoblv = true; } } else { if (bClcikCode == EXEOPERCODE) { inewActiveposj = j; mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_ACTIVE); buttonData.cActive_IDitem = buttonData.BUTTONIDNO_DRAGMOVE; mButtonRedrawblv = true; mButtonResetblv = true; mcurActiveItemosj = j; }else{ mButtonInfoblv = true; } } bretItemIDcd = buttonData.BUTTONIDNO_DRAGMOVE; } // undo if (mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_UNDO) { if (bClcikCode == EXEOPERCODE) { mButtonResetblv = true; }else{ mButtonInfoblv = true; } bretItemIDcd = buttonData.BUTTONIDNO_UNDO; } // restore if (mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_RESTORE) { if (bClcikCode == EXEOPERCODE) { mButtonResetblv = true; }else{ mButtonInfoblv = true; } bretItemIDcd = buttonData.BUTTONIDNO_RESTORE; } if(bretItemIDcd != buttonData.BUTTONIDNO_EMPTY){ cbutRect = rect; break; } } } if(inewActiveposj >= 0) { // remove other active item for (int j = 0; j < mDaItemList.size(); j++) { if (mDaItemList.get(j).getButtonStatus() != buttonData.BUTTONSTATUS_ACTIVE) continue; if (j == inewActiveposj) continue; mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); } }; return bretItemIDcd; } public void clearActiveItem() { if(mcurActiveItemosj >= 0 && mcurActiveItemosj < mDaItemList.size()){ mDaItemList.get(mcurActiveItemosj).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); mcurActiveItemosj = -1; } } public void resetActiveButton() { if(mDaItemList.size() > 0) { for (int j = 0; j < mDaItemList.size(); j++) { if (mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_ACTIVE){ mDaItemList.get(j).updateButtonStatus(buttonData.BUTTONSTATUS_NORMAL); } } } } public void redrawButtonLst(Canvas canvas) { if(mDaItemList.size() > 0){ boolean cstartblv = true; for(int j = 0;j < mDaItemList.size();j++){ if(mDaItemList.get(j).getButtonStatus() == buttonData.BUTTONSTATUS_HIDE) continue; RectF rectF = mDaItemList.get(j).getButtonRectF(); if(cstartblv){ cstartblv = false; fcLeft = rectF.left; fcTop = rectF.top; fcRight = rectF.right; fcBottom = rectF.bottom; }else{ if(rectF.left < fcLeft) fcLeft = rectF.left; if(rectF.top < fcTop) fcTop = rectF.top; if(rectF.right > fcRight) fcRight = rectF.right; if(rectF.bottom > fcBottom) fcBottom = rectF.bottom; } if(mDaItemList.get(j).getButtonShape() == buttonData.BUTTONSHAPE_PATH){ boolean mdrawImgblv = false; if(mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_CLIP){ mdrawImgblv = true; drawImageButton(canvas, mDaItemList.get(j),mSpotLightBmp); } if(mDaItemList.get(j).getButtonIDno() == buttonData.BUTTONIDNO_DRAGMOVE){ mdrawImgblv = true; drawImageButton(canvas, mDaItemList.get(j),mDragMoveBmp); } if(!mdrawImgblv) { drawPathButton(canvas, mDaItemList.get(j)); } }else { if (mDaItemList.get(j).getButtonKind() == buttonData.BUTTONKIND_RECT) { drawRectButton(canvas, mDaItemList.get(j)); } } } } } private void paintButtonShape_Rect(Canvas canvas,buttonData cbutdata) { paint.setColor(buttonData.fillColor); paint.setStyle(Paint.Style.FILL); Rect rect = cbutdata.getButtonRect(); canvas.drawRect(rect, paint); paint.setColor(buttonData.sideColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(buttonData.sideWide); canvas.drawRect(rect, paint); } private void paintButtonShape_RoundRect(Canvas canvas,buttonData cbutdata) { paint.setColor(buttonData.fillColor); paint.setStyle(Paint.Style.FILL); RectF rectF = cbutdata.getButtonRectF(); canvas.drawRoundRect(rectF, buttonData.cornRadius,buttonData.cornRadius,paint); paint.setColor(buttonData.sideColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(buttonData.sideWide); canvas.drawRoundRect(rectF, buttonData.cornRadius,buttonData.cornRadius,paint);; } private void paintButtonShape_Oval(Canvas canvas,buttonData cbutdata) { paint.setColor(buttonData.fillColor); paint.setStyle(Paint.Style.FILL); RectF rectF = cbutdata.getButtonRectF(); RectF exprectF = new RectF(); exprectF.left = rectF.left-buttonData.sideWide*2; exprectF.top = rectF.top-buttonData.sideWide*2; exprectF.right = rectF.right+buttonData.sideWide*2; exprectF.bottom = rectF.bottom+buttonData.sideWide*2; canvas.drawOval(exprectF, paint); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(buttonData.sideWide); paint.setColor(buttonData.sideColor); if(cbutdata.getButtonStatus() == buttonData.BUTTONSTATUS_ACTIVE){ paint.setStrokeWidth(buttonData.activeSideWide); paint.setColor(buttonData.activeColor); } canvas.drawOval(rectF, paint); } private void drawPathButton(Canvas canvas,buttonData cbutdata) { if(cbutdata.getButtonKind() != buttonData.BUTTONKIND_EMPTY){ if(cbutdata.getButtonKind() == buttonData.BUTTONKIND_RECT){ paintButtonShape_Rect(canvas,cbutdata); }; if(cbutdata.getButtonKind() == buttonData.BUTTONKIND_ROUNDRECT){ paintButtonShape_RoundRect(canvas,cbutdata); }; if(cbutdata.getButtonKind() == buttonData.BUTTONKIND_OVAL){ paintButtonShape_Oval(canvas,cbutdata); }; } Rect rect = cbutdata.getButtonRect(); Path sympath = PathParser.doPath(cbutdata.getButtonPath()); Matrix cmaxtrix = new Matrix(); float fscale = cbutdata.getButtonPathScale(); Point point = cbutdata.getButtonPathXYoff(); cmaxtrix.setScale(fscale, fscale); sympath.transform(cmaxtrix); sympath.offset(rect.left+point.x, rect.top+point.y); paint.setStrokeWidth(buttonData.vecLinewd); paint.setStyle(Paint.Style.FILL); paint.setColor(cbutdata.getButtonColor()); canvas.drawPath(sympath, paint); } private void drawImageButton(Canvas canvas,buttonData cbutdata,Bitmap cbutBmp) { if(cbutdata.getButtonKind() != buttonData.BUTTONKIND_EMPTY){ if(cbutdata.getButtonKind() == buttonData.BUTTONKIND_RECT){ paintButtonShape_Rect(canvas,cbutdata); }; if(cbutdata.getButtonKind() == buttonData.BUTTONKIND_ROUNDRECT){ paintButtonShape_RoundRect(canvas,cbutdata); }; if(cbutdata.getButtonKind() == buttonData.BUTTONKIND_OVAL){ paintButtonShape_Oval(canvas,cbutdata); }; } Rect dstRect = cbutdata.getButtonRect(); int ioffv = dstRect.width()/4; dstRect.inset(ioffv,ioffv); Rect srcRect = new Rect(0, 0, cbutBmp.getWidth(), cbutBmp.getHeight()); canvas.drawBitmap(cbutBmp, srcRect, dstRect, paint); } }
2),图形项目类
package com.bi3eview.newstart60.local.Util; import android.graphics.Matrix; import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Canvas; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Paint.FontMetricsInt; import com.bi3eview.newstart60.local.COMCONST; import com.bi3eview.newstart60.local.SelfWidget.PathParser; import java.io.Serializable; import java.util.ArrayList; /** * Created by bs60 on 2022.08.07 */ public class GraphicItemUtil { public static int miokGraItemNum = 0; public static int miItemActiveNum = 0; public static int miundoPosj = -1; public static boolean mClipSelsetRunblv = false; public static int miClipAlpha = 92; public static int mbutWide = 30; public static float FSCALE,TRANSLATIONx,TRANSLATIONy; public static int bmpLEFT,bmpTOP,bmpRIGHT,bmpBOTTOM; public static final byte MARKTYPE_EMPTY = 0; public static final byte MARKTYPE_DELETE = 1; public static final byte MARKTYPE_DRAGMOVE = 2; public static byte mcurMarkType = MARKTYPE_EMPTY; public static float mgraItem_MarkFscale = 1.0f; public static int mgraItem_Xoff = 10; public static int mgraItem_Yoff = 10; final byte STATUS_EMPTY = 0; final byte STATUS_USE = 2; final byte STATUS_DELETE = 3; private ArrayList<GraItemData> mGraItemList = null; private ArrayList<TextData> mTextDataList = null; private ArrayList<ClipData> mClipDataList = null; private ArrayList<PolyLineData> mPolyLineDataList = null; private ArrayList<UndoData> mUndoDataList = null; private ArrayList<graMarkItem> mgraMarkList = null; private int MARKLIST_MAXNUM = 26; private int mcurMarkItemNum = 0; private int mfindMarkItemjno = -1; // final byte KIND_TEXT = 1; int curTxtIDno = 1; int curFntsize = 13; int curTxtColor = Color.RED; String curStrTxt = "ABC123"; final byte COMMONKIND_EMPTY = 0; final byte TEXTICONKIND_HORIZONTAL = 21; final byte TEXTICONKIND_VERTICAL = 22; final byte TEXTICONKIND_ARC = 23; //... public final byte STATUS_EMPTY = 1; //... public final byte STATUS_NORMAL = 2; final byte KIND_CLIP = 2; final byte KINDCLIP_RECT = 1; final byte KINDCLIP_OVAL = 2; int clipColor = Color.argb(64,255,255,255); final byte KIND_POLYLINE = 3; int curPolyIDno = 1; int polyColor = Color.argb(255,0,255,0); int curLinewd = 6; int curTransparent = 200; final byte KIND_OPEN = 1; final byte KIND_CLOSE = 2; final byte STATUS_NORMAL = 1; final byte MARKICONKIND_LINE = 51; final byte MARKICONKIND_OVAL = 53; final byte MARKICONKIND_SOLIDOVAL = 63; final byte MARKICONKIND_ARROW = 54; final byte KIND_EMPTY = 0; int mdrawGraItempj = -1; int miItemIDno = 1; // drag move boolean mdrawDragMoveblv = false; int mdrawDragMove_Clipposj = -1; int mdrawDragMove_Textposj = -1; int mdrawDragMove_Markposj = -1; int mdrawDrag_MoveXoff = 0; int mdrawDrag_MoveYoff = 0; // clip int miItemSpaceNum = 0; int miClipNum = 0; int miGraClipItemposj = -1; int miClipItemposj = -1; int miClipItemIDno = -1; int miUndoClipGraItempj = -1; int mondrawClipLstpj = -1; int miSelgraItemposj = -1; int miGraItemposj = -1; // text int miSelTextItemposj = -1; // draw int miSelDrawItemposj = -1; // check trace String mTraceInfo = ""; // public GraphicItemUtil() { FSCALE = 1; TRANSLATIONx = 0; TRANSLATIONy = 0; mGraItemList = new ArrayList<>(); miItemIDno = 1; miItemActiveNum = 0; miItemSpaceNum = 0; miClipNum = 0; miGraClipItemposj = -1; miClipItemposj = -1; miClipItemIDno = -1; miUndoClipGraItempj = -1; miSelgraItemposj = -1; miGraItemposj = -1; miSelTextItemposj = -1; mTextDataList = new ArrayList<>(); mClipDataList = new ArrayList<>(); mPolyLineDataList = new ArrayList<>(); mUndoDataList = new ArrayList<>(); mcurMarkItemNum = 0; mgraMarkList = new ArrayList<>(); for(int jm = 0;jm < MARKLIST_MAXNUM;jm++){ graMarkItem gmark = new graMarkItem(); mgraMarkList.add(gmark); } } private void initResetBasicPara() { FSCALE = 1; TRANSLATIONx = 0; TRANSLATIONy = 0; miItemIDno = 1; miItemActiveNum = 0; miItemSpaceNum = 0; miundoPosj = -1; miClipNum = 0; miGraClipItemposj = -1; miClipItemposj = -1; miClipItemIDno = -1; miUndoClipGraItempj = -1; miSelgraItemposj = -1; miGraItemposj = -1; miSelTextItemposj = -1; mcurMarkItemNum = 0; } public String GetTraceInfo(){ return mTraceInfo; } public boolean appendOrupdateClipItem(byte ckind,int iColor,Rect crect) { boolean cretblv = true; mTraceInfo = "11:"+String.valueOf(miClipItemIDno)+","+String.valueOf(miClipItemposj)+",Gra:"+String.valueOf(miGraClipItemposj);//xxxxxxxx if(miClipItemIDno > 0 || miClipItemposj >= 0){// update if(miClipItemposj >= 0 && miGraClipItemposj >= 0){ if(miGraClipItemposj >= 0 && miGraClipItemposj < mGraItemList.size()){ mTraceInfo = mTraceInfo +":>>USE";//xxxxxxxxxxx mGraItemList.get(miGraClipItemposj).status = STATUS_USE; } mClipDataList.get(miClipItemposj).kind = ckind; mClipDataList.get(miClipItemposj).caColor = iColor; mClipDataList.get(miClipItemposj).crect = crect; //... mGraItemList.get(miClipItemposj).status = STATUS_USE; if(miGraClipItemposj >= 0) { UndoData undoData = new UndoData(KIND_CLIP, STATUS_USE, miGraClipItemposj); if(miUndoClipGraItempj >= 0 && miUndoClipGraItempj < mUndoDataList.size()){ mUndoDataList.remove(miUndoClipGraItempj); } miUndoClipGraItempj = mUndoDataList.size(); mUndoDataList.add(undoData); } }else{ cretblv = false; } }else {// append miGraClipItemposj = mGraItemList.size(); GraItemData gItem = new GraItemData(); gItem.kind = KIND_CLIP; gItem.IDno = miItemIDno; gItem.posj = mClipDataList.size(); gItem.status = STATUS_USE; ClipData clipdata = new ClipData(ckind, iColor, crect, miItemIDno); mGraItemList.add(gItem); mClipDataList.add(clipdata); miClipItemIDno = miItemIDno; miItemIDno++; miItemActiveNum++; miItemSpaceNum++; UndoData undoData = new UndoData(KIND_CLIP, STATUS_USE, miGraClipItemposj); miUndoClipGraItempj = mUndoDataList.size(); mUndoDataList.add(undoData); } mClipSelsetRunblv = false; miundoPosj = mUndoDataList.size(); return cretblv; } public boolean appendOrupdateTextItem(byte ckind,int iColor,int ifntsize,int ixpos,int iypos,String strTxt) { boolean cretblv = true; if(miSelTextItemposj >= 0){// update //... mTextDataList.get(miSelTextItemposj).mkind = ckind; //... mTextDataList.get(miClipItemposj).color = iColor; mTextDataList.get(miSelTextItemposj).point.x = ixpos; mTextDataList.get(miSelTextItemposj).point.y = iypos; cretblv = false; }else {// append miGraItemposj = mGraItemList.size(); GraItemData gItem = new GraItemData(); gItem.kind = KIND_TEXT; gItem.IDno = miItemIDno; gItem.posj = mTextDataList.size(); gItem.status = STATUS_USE; mGraItemList.add(gItem); // TextData txtdata = new TextData();// ckind, iColor, crect, miGraItemposj); txtdata.color = iColor; txtdata.mkind = ckind; txtdata.fntsize = ifntsize; txtdata.point.x = ixpos; txtdata.point.y = iypos; txtdata.strTxt = strTxt; mTextDataList.add(txtdata); miItemIDno++; miItemActiveNum++; miItemSpaceNum++; UndoData undoData = new UndoData(KIND_TEXT, STATUS_USE, miGraItemposj); miUndoClipGraItempj = mUndoDataList.size(); mUndoDataList.add(undoData); } mClipSelsetRunblv = false; miundoPosj = mUndoDataList.size(); return cretblv; } public boolean appendOrupdateDrawItem(byte ckind,int iColor,int iLinewide,int iTransparent,ArrayList<Point> pointLst) { boolean cretblv = true; if(miSelDrawItemposj >= 0){// update if(pointLst.size() > 0) { int ixoffv = pointLst.get(0).x; int iyoffv = pointLst.get(0).y; if(mPolyLineDataList.get(miSelDrawItemposj).points.size() > 0) { for(int jp = 0;jp < mPolyLineDataList.get(miSelDrawItemposj).points.size();jp++) { mPolyLineDataList.get(miSelDrawItemposj).points.get(jp).x = mPolyLineDataList.get(miSelDrawItemposj).points.get(jp).x+ixoffv; mPolyLineDataList.get(miSelDrawItemposj).points.get(jp).y = mPolyLineDataList.get(miSelDrawItemposj).points.get(jp).y+iyoffv; } } } cretblv = false; }else {// append miGraItemposj = mGraItemList.size(); GraItemData gItem = new GraItemData(); gItem.kind = KIND_POLYLINE; gItem.IDno = miItemIDno; gItem.posj = mPolyLineDataList.size(); gItem.status = STATUS_USE; mGraItemList.add(gItem); // PolyLineData drawdata = new PolyLineData();// ckind, iColor, crect, miGraItemposj); drawdata.gkind = ckind; drawdata.iColor = iColor; drawdata.icLwd = iLinewide; drawdata.iTransparentv = iTransparent; for(int jp = 0;jp < pointLst.size();jp++) { drawdata.points.add(pointLst.get(jp)); } mPolyLineDataList.add(drawdata); miItemIDno++; miItemActiveNum++; miItemSpaceNum++; UndoData undoData = new UndoData(KIND_TEXT, STATUS_USE, miGraItemposj); miUndoClipGraItempj = mUndoDataList.size(); mUndoDataList.add(undoData); } mClipSelsetRunblv = false; miundoPosj = mUndoDataList.size(); return cretblv; } public void setClipSelRunStatus(boolean setblv) { mClipSelsetRunblv = setblv; } public void clearGraphicsItem() { miItemActiveNum = 0; mTextDataList.clear(); mPolyLineDataList.clear(); mGraItemList.clear(); mUndoDataList.clear(); initResetBasicPara(); } public int checkGetGraItemNum() { int iretnum = 0; if(mGraItemList.size() > 0) { for (int j = 0; j < mGraItemList.size(); j++) { if (mGraItemList.get(j).status != STATUS_USE) continue; iretnum++; } } return iretnum; } public int checkGetCurGraItem() { int itemNum = 0; if(mGraItemList.size() > 0){ for(int j = 0;j < mGraItemList.size();j++) { if (mGraItemList.get(j).status != STATUS_USE) continue; itemNum++; }; }; return itemNum; } public int checkGetCurGraClipItem() { int itemNum = 0; if(mGraItemList.size() > 0){ for(int j = 0;j < mGraItemList.size();j++) { if (mGraItemList.get(j).status != STATUS_USE) continue; if(mGraItemList.get(j).kind == KIND_CLIP) { itemNum++; } }; }; return itemNum; } public void GraphicsOnDraw(Canvas canvas) { mondrawClipLstpj = -1; if(miItemActiveNum <= 0){ miItemActiveNum = 0; if(mGraItemList.size() > 0){ for(int j = 0;j < mGraItemList.size();j++) { if (mGraItemList.get(j).status != STATUS_USE) continue; miItemActiveNum++; }; }; } if(miItemActiveNum <= 0) return; int idrawClipItemposj = -1; int idrawClipItemIDno = -1; int igraItemposj = -1; int icurActiveNum = 0; mcurMarkItemNum = 0; for(int j = 0;j < mGraItemList.size();j++) { if (mGraItemList.get(j).status != STATUS_USE) continue; if (mGraItemList.get(j).kind == KIND_CLIP) { idrawClipItemposj = mGraItemList.get(j).posj; idrawClipItemIDno = mGraItemList.get(j).IDno; igraItemposj = j; miGraClipItemposj = j; icurActiveNum++; if (idrawClipItemposj >= 0 || idrawClipItemIDno > 0) { if (!mClipSelsetRunblv) { int iretItempj = drawClipItem(canvas, idrawClipItemposj, idrawClipItemIDno); if (idrawClipItemposj < 0 && iretItempj >= 0) { mGraItemList.get(igraItemposj).setGraItemDataPosj(iretItempj); idrawClipItemposj = iretItempj; } mondrawClipLstpj = iretItempj; miClipItemposj = idrawClipItemposj; } } continue; } } for(int j = 0;j < mGraItemList.size();j++){ if(mGraItemList.get(j).status != STATUS_USE) continue; if(mGraItemList.get(j).kind == KIND_CLIP){ continue; } mdrawGraItempj = j; if(mGraItemList.get(j).kind == KIND_TEXT){ int iTextposj = mGraItemList.get(j).posj; if(iTextposj >= 0 && iTextposj < mTextDataList.size()){ drawTextItem(canvas,iTextposj); icurActiveNum++; } } if(mGraItemList.get(j).kind == KIND_POLYLINE){ int iDrawposj = mGraItemList.get(j).posj; if(iDrawposj >= 0 && iDrawposj < mPolyLineDataList.size()){ drawMarkItem(canvas,iDrawposj); icurActiveNum++; } } } miItemActiveNum = icurActiveNum; if(mcurMarkItemNum > 0){ Paint paint = new Paint(); for(int jm = 0;jm < mcurMarkItemNum;jm++){ paint.setColor(mgraMarkList.get(jm).iColorv); paint.setStyle(Paint.Style.FILL); canvas.drawOval(mgraMarkList.get(jm).markRectf, paint); RectF rectf = new RectF(mgraMarkList.get(jm).markRectf); rectf.inset(1,1); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(1); paint.setColor(Color.BLACK); canvas.drawOval(rectf, paint); rectf.inset(1,1); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(1); paint.setColor(Color.WHITE); canvas.drawOval(rectf, paint); int ivColor = 0xFFFFFFff-mgraMarkList.get(jm).iColorv+0xFF000000; Path sympath = PathParser.doPath(COMCONST.EDITBUTTON_DELETE); if(mcurMarkType == MARKTYPE_DRAGMOVE){ sympath = PathParser.doPath(COMCONST.GRAITEM_DRAGMOVE); } Matrix cmaxtrix = new Matrix(); cmaxtrix.setScale(mgraItem_MarkFscale, mgraItem_MarkFscale); sympath.transform(cmaxtrix); sympath.offset(mgraMarkList.get(jm).markRectf.left+mgraItem_Xoff, mgraMarkList.get(jm).markRectf.top+mgraItem_Yoff); paint.setStrokeWidth(2); paint.setColor(ivColor); canvas.drawPath(sympath, paint); } } } public boolean updateSetDragMovePara(int ixmove,int iymove) { mdrawDragMoveblv = true; mdrawDrag_MoveXoff = ixmove; mdrawDrag_MoveYoff = iymove; return true; } public boolean confirmDeleteSelItem() { boolean cretblv = false; if (mfindMarkItemjno >= 0 && mfindMarkItemjno < mcurMarkItemNum) { int igraposj = mgraMarkList.get(mfindMarkItemjno).igraPosj; byte cmkind = mgraMarkList.get(mfindMarkItemjno).kind; if(cmkind == KIND_CLIP){ } int itemposj = mgraMarkList.get(mfindMarkItemjno).itemposj; if (igraposj >= 0 && igraposj < mGraItemList.size()) { mGraItemList.get(igraposj).status = STATUS_DELETE; cretblv = true; } } return cretblv; } public boolean confirmDragMoveItem() { boolean cretblv = false; if(mdrawDragMoveblv) { if (mfindMarkItemjno >= 0 && mfindMarkItemjno < mcurMarkItemNum) { int igraposj = mgraMarkList.get(mfindMarkItemjno).igraPosj; byte cmkind = mgraMarkList.get(mfindMarkItemjno).kind; int itemposj = mgraMarkList.get(mfindMarkItemjno).itemposj; if (cmkind == KIND_CLIP) { if (itemposj >= 0 && itemposj < mClipDataList.size()) { mClipDataList.get(itemposj).crect.left = (int) (mClipDataList.get(itemposj).crect.left + mdrawDrag_MoveXoff); mClipDataList.get(itemposj).crect.right = (int) (mClipDataList.get(itemposj).crect.right + mdrawDrag_MoveXoff); mClipDataList.get(itemposj).crect.top = (int) (mClipDataList.get(itemposj).crect.top + mdrawDrag_MoveYoff); mClipDataList.get(itemposj).crect.bottom = (int) (mClipDataList.get(itemposj).crect.bottom + mdrawDrag_MoveYoff); cretblv = true; } } if (cmkind == KIND_TEXT) { if (itemposj >= 0 && itemposj < mTextDataList.size()) { mTextDataList.get(itemposj).point.x = mTextDataList.get(itemposj).point.x + mdrawDrag_MoveXoff; mTextDataList.get(itemposj).point.y = mTextDataList.get(itemposj).point.y + mdrawDrag_MoveYoff; cretblv = true; } } if (cmkind == KIND_POLYLINE) { if (itemposj >= 0 && itemposj < mPolyLineDataList.size()) { byte gkind = mPolyLineDataList.get(itemposj).gkind; if(gkind == MARKICONKIND_LINE){ for(int jp = 0;jp < mPolyLineDataList.get(itemposj).points.size();jp++){ mPolyLineDataList.get(itemposj).points.get(jp).x = mPolyLineDataList.get(itemposj).points.get(jp).x+mdrawDrag_MoveXoff; mPolyLineDataList.get(itemposj).points.get(jp).y = mPolyLineDataList.get(itemposj).points.get(jp).y+mdrawDrag_MoveYoff; } cretblv = true; } if(gkind == MARKICONKIND_OVAL || gkind == MARKICONKIND_SOLIDOVAL || gkind == MARKICONKIND_ARROW){ mPolyLineDataList.get(itemposj).points.get(0).x = mPolyLineDataList.get(itemposj).points.get(0).x+mdrawDrag_MoveXoff; mPolyLineDataList.get(itemposj).points.get(0).y = mPolyLineDataList.get(itemposj).points.get(0).y+mdrawDrag_MoveYoff; mPolyLineDataList.get(itemposj).points.get(1).x = mPolyLineDataList.get(itemposj).points.get(1).x+mdrawDrag_MoveXoff; mPolyLineDataList.get(itemposj).points.get(1).y = mPolyLineDataList.get(itemposj).points.get(1).y+mdrawDrag_MoveYoff; cretblv = true; } } } } } mdrawDragMoveblv = false; mdrawDrag_MoveXoff = 0; mdrawDrag_MoveYoff = 0; mdrawDragMove_Clipposj = -1; mdrawDragMove_Textposj = -1; mdrawDragMove_Markposj = -1; return cretblv; } public boolean findMarkDrawItem(float fx,float fy) { boolean cretblv = false; mdrawDragMoveblv = false; mdrawDragMove_Clipposj = -1; mdrawDragMove_Textposj = -1; mdrawDragMove_Markposj = -1; mdrawDrag_MoveXoff = 0; mdrawDrag_MoveYoff = 0; mfindMarkItemjno = -1; if(mcurMarkItemNum > 0){ for(int jm = 0;jm < mcurMarkItemNum;jm++){ if(fx <= mgraMarkList.get(jm).markRectf.left) continue; if(fx >= mgraMarkList.get(jm).markRectf.right) continue; if(fy <= mgraMarkList.get(jm).markRectf.top) continue; if(fy >= mgraMarkList.get(jm).markRectf.bottom) continue; mfindMarkItemjno = jm; byte cmkind = mgraMarkList.get(jm).kind; int itemposj = mgraMarkList.get(jm).itemposj; if(cmkind == KIND_CLIP) { if (itemposj >= 0 && itemposj < mClipDataList.size()) { mdrawDragMove_Clipposj = itemposj; } } if(cmkind == KIND_TEXT) { if (itemposj >= 0 && itemposj < mTextDataList.size()) { mdrawDragMove_Textposj = itemposj; } } if(cmkind == KIND_POLYLINE){ if(itemposj >= 0 && itemposj < mPolyLineDataList.size()){ mdrawDragMove_Markposj = itemposj; } } cretblv = true; break; } } return cretblv; } private void drawTextItem(Canvas canvas,int iTextposj) { if(iTextposj >= 0 && iTextposj < mTextDataList.size()) { int iColorv = mTextDataList.get(iTextposj).color; int ifntsize = (int)(mTextDataList.get(iTextposj).fntsize*FSCALE); byte mkind = mTextDataList.get(iTextposj).mkind; String strTxt = mTextDataList.get(iTextposj).strTxt; Paint paint = new Paint(); int ixpos = (int)(mTextDataList.get(iTextposj).point.x*FSCALE+TRANSLATIONx); int iypos = (int)(mTextDataList.get(iTextposj).point.y*FSCALE+TRANSLATIONy); if(mdrawDragMoveblv && mdrawDragMove_Textposj == iTextposj){ ixpos = (int)((mTextDataList.get(iTextposj).point.x+mdrawDrag_MoveXoff)*FSCALE+TRANSLATIONx); iypos = (int)((mTextDataList.get(iTextposj).point.y+mdrawDrag_MoveYoff)*FSCALE+TRANSLATIONy);; } if(mkind == TEXTICONKIND_HORIZONTAL){ paint.setColor(iColorv); paint.setTextSize(ifntsize); paint.setStyle(Paint.Style.FILL); canvas.drawText(strTxt,ixpos,iypos,paint); if(mcurMarkType != MARKTYPE_EMPTY) { appendNewMarkItem(KIND_TEXT,mdrawGraItempj,iTextposj,iColorv,ixpos,iypos); } } if(mkind == TEXTICONKIND_VERTICAL){ GraphicsExpItem.drawVertical2Text(canvas,strTxt,iColorv,ifntsize,ixpos,iypos); if(mcurMarkType != MARKTYPE_EMPTY) { appendNewMarkItem(KIND_TEXT,mdrawGraItempj,iTextposj,iColorv,ixpos,iypos); } } if(mkind == TEXTICONKIND_ARC){ GraphicsExpItem.drawTextOnArc(canvas,strTxt,iColorv,ifntsize,ixpos,iypos); if(mcurMarkType != MARKTYPE_EMPTY) { appendNewMarkItem(KIND_TEXT,mdrawGraItempj,iTextposj,iColorv,ixpos,iypos); } } } } private void drawMarkItem(Canvas canvas,int iDrawposj) { if(iDrawposj >= 0 && iDrawposj < mPolyLineDataList.size()) { int iColorv = mPolyLineDataList.get(iDrawposj).iColor; int iLinewd = (int)(mPolyLineDataList.get(iDrawposj).icLwd*FSCALE); byte gkind = mPolyLineDataList.get(iDrawposj).gkind; int iTransparentv = mPolyLineDataList.get(iDrawposj).iTransparentv; int iRed = Color.red(iColorv); int iGreen = Color.green(iColorv); int iBlue = Color.blue(iColorv); int curDrawColorv = Color.argb(iTransparentv,iRed,iGreen,iBlue); Paint paint = new Paint(); if(gkind == MARKICONKIND_LINE){ Path polyLinepath = new Path(); //... fxpos = mPolyLineList.get(0).x; //... fypos = mPolyLineList.get(0).y; int ixpos = (int)(mPolyLineDataList.get(iDrawposj).points.get(0).x*FSCALE+TRANSLATIONx); int iypos = (int)(mPolyLineDataList.get(iDrawposj).points.get(0).y*FSCALE+TRANSLATIONy); if(mdrawDragMoveblv && mdrawDragMove_Markposj == iDrawposj){ ixpos = (int)((mPolyLineDataList.get(iDrawposj).points.get(0).x+mdrawDrag_MoveXoff)*FSCALE+TRANSLATIONx); iypos = (int)((mPolyLineDataList.get(iDrawposj).points.get(0).y+mdrawDrag_MoveYoff)*FSCALE+TRANSLATIONy); } polyLinepath.moveTo(ixpos,iypos); if(mcurMarkType != MARKTYPE_EMPTY) { appendNewMarkItem(KIND_POLYLINE, mdrawGraItempj, iDrawposj, iColorv, ixpos, iypos); } for(int jp = 1;jp < mPolyLineDataList.get(iDrawposj).points.size();jp++){ ixpos = (int)(mPolyLineDataList.get(iDrawposj).points.get(jp).x*FSCALE+TRANSLATIONx); iypos = (int)(mPolyLineDataList.get(iDrawposj).points.get(jp).y*FSCALE+TRANSLATIONy); if(mdrawDragMoveblv && mdrawDragMove_Markposj == iDrawposj){ ixpos = (int)((mPolyLineDataList.get(iDrawposj).points.get(jp).x+mdrawDrag_MoveXoff)*FSCALE+TRANSLATIONx); iypos = (int)((mPolyLineDataList.get(iDrawposj).points.get(jp).y+mdrawDrag_MoveYoff)*FSCALE+TRANSLATIONy); } polyLinepath.lineTo(ixpos,iypos); } paint.setStyle(Paint.Style.STROKE); paint.setAntiAlias(true); // 去锯齿 paint.setColor(curDrawColorv);// miDrawColorv); paint.setStrokeWidth(iLinewd); canvas.drawPath(polyLinepath, paint); } if(gkind == MARKICONKIND_OVAL){ float fLeft = (float)(mPolyLineDataList.get(iDrawposj).points.get(0).x*FSCALE+TRANSLATIONx); float fRight = (float)(mPolyLineDataList.get(iDrawposj).points.get(1).x*FSCALE+TRANSLATIONx); float fTop = (float)(mPolyLineDataList.get(iDrawposj).points.get(0).y*FSCALE+TRANSLATIONy); float fBottom = (float)(mPolyLineDataList.get(iDrawposj).points.get(1).y*FSCALE+TRANSLATIONy); if(mdrawDragMoveblv && mdrawDragMove_Markposj == iDrawposj){ fLeft = (float)((mPolyLineDataList.get(iDrawposj).points.get(0).x+mdrawDrag_MoveXoff)*FSCALE+TRANSLATIONx); fRight = (float)((mPolyLineDataList.get(iDrawposj).points.get(1).x+mdrawDrag_MoveXoff)*FSCALE+TRANSLATIONx); fTop = (float)((mPolyLineDataList.get(iDrawposj).points.get(0).y+mdrawDrag_MoveYoff)*FSCALE+TRANSLATIONy); fBottom = (float)((mPolyLineDataList.get(iDrawposj).points.get(1).y+mdrawDrag_MoveYoff)*FSCALE+TRANSLATIONy); } RectF rectF = new RectF(fLeft, fTop,fRight,fBottom); Path drawpath = new Path(); drawpath.addOval(rectF, Path.Direction.CCW); paint.setStyle(Paint.Style.STROKE); paint.setAntiAlias(true); // 去锯齿 paint.setColor(curDrawColorv);// miDrawColorv); paint.setStrokeWidth(iLinewd); canvas.drawPath(drawpath, paint); if(mcurMarkType != MARKTYPE_EMPTY) { appendNewMarkItem(KIND_POLYLINE, mdrawGraItempj, iDrawposj, iColorv, (int) ((fLeft + fRight) / 2), (int) ((fTop + fBottom) / 2)); } } if(gkind == MARKICONKIND_SOLIDOVAL){ float fLeft = (float)(mPolyLineDataList.get(iDrawposj).points.get(0).x*FSCALE+TRANSLATIONx); float fRight = (float)(mPolyLineDataList.get(iDrawposj).points.get(1).x*FSCALE+TRANSLATIONx); float fTop = (float)(mPolyLineDataList.get(iDrawposj).points.get(0).y*FSCALE+TRANSLATIONy); float fBottom = (float)(mPolyLineDataList.get(iDrawposj).points.get(1).y*FSCALE+TRANSLATIONy); if(mdrawDragMoveblv && mdrawDragMove_Markposj == iDrawposj){ fLeft = (float)((mPolyLineDataList.get(iDrawposj).points.get(0).x+mdrawDrag_MoveXoff)*FSCALE+TRANSLATIONx); fRight = (float)((mPolyLineDataList.get(iDrawposj).points.get(1).x+mdrawDrag_MoveXoff)*FSCALE+TRANSLATIONx); fTop = (float)((mPolyLineDataList.get(iDrawposj).points.get(0).y+mdrawDrag_MoveYoff)*FSCALE+TRANSLATIONy); fBottom = (float)((mPolyLineDataList.get(iDrawposj).points.get(1).y+mdrawDrag_MoveYoff)*FSCALE+TRANSLATIONy); } RectF rectF = new RectF(fLeft, fTop,fRight,fBottom); Path drawpath = new Path(); drawpath.addOval(rectF, Path.Direction.CCW); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); // 去锯齿 paint.setColor(curDrawColorv);// miDrawColorv); //... paint.setStrokeWidth(miLinewide); canvas.drawPath(drawpath, paint); if(mcurMarkType != MARKTYPE_EMPTY) { appendNewMarkItem(KIND_POLYLINE, mdrawGraItempj, iDrawposj, iColorv, (int) ((fLeft + fRight) / 2), (int) ((fTop + fBottom) / 2)); } } if(gkind == MARKICONKIND_ARROW){ float fLeft = (float)(mPolyLineDataList.get(iDrawposj).points.get(0).x*FSCALE+TRANSLATIONx); float fRight = (float)(mPolyLineDataList.get(iDrawposj).points.get(1).x*FSCALE+TRANSLATIONx); float fTop = (float)(mPolyLineDataList.get(iDrawposj).points.get(0).y*FSCALE+TRANSLATIONy); float fBottom = (float)(mPolyLineDataList.get(iDrawposj).points.get(1).y*FSCALE+TRANSLATIONy); if(mdrawDragMoveblv && mdrawDragMove_Markposj == iDrawposj){ fLeft = (float)((mPolyLineDataList.get(iDrawposj).points.get(0).x+mdrawDrag_MoveXoff)*FSCALE+TRANSLATIONx); fRight = (float)((mPolyLineDataList.get(iDrawposj).points.get(1).x+mdrawDrag_MoveXoff)*FSCALE+TRANSLATIONx); fTop = (float)((mPolyLineDataList.get(iDrawposj).points.get(0).y+mdrawDrag_MoveYoff)*FSCALE+TRANSLATIONy); fBottom = (float)((mPolyLineDataList.get(iDrawposj).points.get(1).y+mdrawDrag_MoveYoff)*FSCALE+TRANSLATIONy); } GraphicsExpItem.drawARROW(canvas,(int)fLeft, (int)fTop,(int)fRight,(int)fBottom,curDrawColorv,iLinewd); if(mcurMarkType != MARKTYPE_EMPTY) { appendNewMarkItem(KIND_POLYLINE, mdrawGraItempj, iDrawposj, iColorv, (int) ((fLeft + fRight) / 2), (int) ((fTop + fBottom) / 2)); } } } } private int drawClipItem(Canvas canvas,int iClipItemposj,int iClipItemIDno) { int itemposj = iClipItemposj; if(iClipItemposj < 0 && iClipItemIDno > 0){ for(int ic = 0;ic < mClipDataList.size();ic++){ if(mClipDataList.get(ic).itemIDno != iClipItemIDno) continue; itemposj = ic; break; } } if(itemposj >= 0){ Paint paint = new Paint(); RectF outrectF = new RectF(); outrectF.left = bmpLEFT*FSCALE+TRANSLATIONx; outrectF.top = bmpTOP*FSCALE+TRANSLATIONy; outrectF.right = bmpRIGHT*FSCALE+TRANSLATIONx; outrectF.bottom = bmpBOTTOM*FSCALE+TRANSLATIONy; Path clipRectpath = new Path(); clipRectpath.addRect(outrectF, Path.Direction.CCW); int iClipColorv = mClipDataList.get(itemposj).caColor; Rect rect = new Rect(); rect.left = mClipDataList.get(itemposj).crect.left; rect.right = mClipDataList.get(itemposj).crect.right; rect.top = mClipDataList.get(itemposj).crect.top; rect.bottom = mClipDataList.get(itemposj).crect.bottom; if(mdrawDragMoveblv && mdrawDragMove_Clipposj == itemposj){ rect.left = rect.left+mdrawDrag_MoveXoff; rect.right = rect.right+mdrawDrag_MoveXoff; rect.top = rect.top+mdrawDrag_MoveYoff; rect.bottom = rect.bottom+mdrawDrag_MoveYoff; } RectF cliprectF= new RectF(); cliprectF.left = rect.left*FSCALE+TRANSLATIONx; cliprectF.top = rect.top*FSCALE+TRANSLATIONy; cliprectF.right = rect.right*FSCALE+TRANSLATIONx; cliprectF.bottom = rect.bottom*FSCALE+TRANSLATIONy; if(mClipDataList.get(itemposj).kind == KINDCLIP_RECT){ clipRectpath.addRect(cliprectF, Path.Direction.CW); if(mcurMarkType != MARKTYPE_EMPTY) { appendNewMarkItem(KIND_CLIP, miGraClipItemposj, itemposj, iClipColorv, (int) ((cliprectF.left + cliprectF.right) / 2), (int) ((cliprectF.top + cliprectF.bottom) / 2)); } } if(mClipDataList.get(itemposj).kind == KINDCLIP_OVAL){ clipRectpath.addOval(cliprectF, Path.Direction.CW); int ixpos = (int)((cliprectF.left+cliprectF.right)/2); int iypos = (int)((cliprectF.top+cliprectF.bottom)/2); if(mcurMarkType != MARKTYPE_EMPTY) { appendNewMarkItem(KIND_CLIP, miGraClipItemposj, itemposj, iClipColorv, ixpos, iypos); } } int iRed = Color.red(iClipColorv); int iGreen = Color.green(iClipColorv); int iBlue = Color.blue(iClipColorv); paint.setColor(Color.argb(miClipAlpha,iRed,iGreen,iBlue)); paint.setStyle(Paint.Style.FILL); canvas.drawPath(clipRectpath, paint); } return itemposj; } public Rect getOndrawClipRect() { Rect rect = new Rect(0,1,0,1); if(mondrawClipLstpj >= 0 && mondrawClipLstpj < mClipDataList.size()){ rect = mClipDataList.get(mondrawClipLstpj).crect; }; return rect; } public byte getOndrawClipKind() { byte ckind = 0; if(mondrawClipLstpj >= 0 && mondrawClipLstpj < mClipDataList.size()){ ckind = mClipDataList.get(mondrawClipLstpj).kind; }; return ckind; } private void appendNewMarkItem(byte ckind,int igraposj,int itemposj,int cColorv,int ixpos,int iypos) { if(mcurMarkItemNum >=0 && mcurMarkItemNum < mgraMarkList.size()) { mgraMarkList.get(mcurMarkItemNum).updateResetPara(ckind, igraposj, itemposj, cColorv, ixpos, iypos, mbutWide/2); mcurMarkItemNum++; } } // class graMarkItem implements Serializable { private byte kind; private int igraPosj,itemposj; private int iColorv; RectF markRectf; public graMarkItem() { kind = 0; igraPosj = -1; itemposj = -1; iColorv = Color.RED; markRectf = new RectF(); markRectf.left = 0; markRectf.right = 60; markRectf.top = 0; markRectf.bottom = 60; } public graMarkItem(byte ckind,int igposj,int itposj,int cColor,int ixpos,int iypos,int butwide) { kind = ckind; igraPosj = igposj; itemposj = itposj; iColorv = cColor; markRectf = new RectF(); markRectf.left = ixpos-butwide; markRectf.right = ixpos+butwide; markRectf.top = iypos-butwide; markRectf.bottom = iypos+butwide; } public void updateResetPara(byte ckind,int igposj,int itposj,int cColor,int ixpos,int iypos,int butwide) { kind = ckind; igraPosj = igposj; itemposj = itposj; iColorv = cColor; markRectf.left = ixpos-butwide; markRectf.right = ixpos+butwide; markRectf.top = iypos-butwide; markRectf.bottom = iypos+butwide; } } // class GraItemData implements Serializable { private byte kind,status; private int IDno,posj; public GraItemData() { kind = KIND_TEXT; status = STATUS_NORMAL; IDno = 0; posj = -1; } // set public void setData(byte ckind,byte cstatus,int iIDno,int iposj) { kind = ckind; status = cstatus; IDno = iIDno; posj = iposj; } // set public void setGraItemDataPosj(int iposj){ posj = iposj; } // get public byte getKind(){ return kind;} public byte getStatus(){ return status;} } // class ClipData implements Serializable { private Rect crect; private byte kind; private int caColor; private int itemIDno; public ClipData() { kind = KINDCLIP_RECT; caColor = clipColor; itemIDno = -1; crect = new Rect(100,100,600,900); } public ClipData(byte ckind,int icolor,Rect cSrect,int itemCIDno) { kind = ckind; caColor = icolor; itemIDno = itemCIDno; crect = cSrect; } } //... class TextData implements Serializable { private byte status; private byte mkind; private String strTxt; private int color; private int fntsize; private int txIDno; private Point point; public TextData() { status = STATUS_EMPTY; strTxt = curStrTxt; color = curTxtColor; fntsize = curFntsize; txIDno = curTxtIDno; point = new Point(100,160); } } // class PolyLineData implements Serializable { //... private byte status; private byte gkind; //... private int ipolyIDno; private int iColor; private int icLwd; private int iTransparentv; private ArrayList<Point> points = null; public PolyLineData(){ //... status = STATUS_EMPTY; gkind = MARKICONKIND_LINE; iTransparentv = curTransparent; iColor = polyColor; icLwd = curLinewd; points = new ArrayList<>(); } // set public void SetParaItem(byte cgkind,int icColor,int icLinewide,int icTranspaent,ArrayList<Point> cpointLst){ gkind = cgkind; iColor = icColor; icLwd = icLinewide; iTransparentv = icTranspaent; if(cpointLst.size() > 0){ for(int jpt = 0;jpt < cpointLst.size();jpt++){ points.add(cpointLst.get(jpt)); }; } } } // class UndoData implements Serializable { byte gkind,status; private int igraItempos; public UndoData() { gkind = KIND_EMPTY; status = STATUS_EMPTY; igraItempos = -1; } public UndoData(byte kind,byte Status,int igraposj) { gkind = kind; status = Status; igraItempos = igraposj; } } } ----------------------------------------- package com.bi3eview.newstart60.local.Util; import android.graphics.Matrix; import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Paint; import android.graphics.Point; import android.graphics.Canvas; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Paint.FontMetricsInt; import android.text.Layout.Alignment; import android.text.StaticLayout; import android.text.TextPaint; /** * Created by bs60 on 2022.08.24 */ public class GraphicsExpItem { public static void drawTextOnArc(Canvas canvas, String textString,int textColor,int fontSize,int ixpos,int iypos){ Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.RED); paint.setTextSize(fontSize); paint.setStyle(Paint.Style.STROKE); float measuredWidth = paint.measureText(textString); float bxfa = 3.5f; float b = (float)((measuredWidth*2/(2*3.14159+4*bxfa-4))*1.1); float a = b*bxfa; RectF rectF2 = new RectF(ixpos-a,iypos,ixpos+a,iypos+b*2); Path path = new Path(); path.addArc(rectF2, 180,360); paint.setStyle(Paint.Style.FILL); paint.setColor(textColor); float voffset = 0;// 50 canvas.drawTextOnPath(textString, path, 0, voffset, paint); } private static boolean isChineseByBlock(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C//jdk1.7 || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D//jdk1.7 || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT) { return true; } return false; } private static boolean isChinesePuctuation(char c) { Character.UnicodeBlock ub = Character.UnicodeBlock.of(c); if (ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_FORMS || ub == Character.UnicodeBlock.VERTICAL_FORMS) { //jdk1.7 return true; } return false; } public static boolean isChinese(char str) { int charASCII = Integer.valueOf(str); if(charASCII >= 1 && charASCII <= 126){ return false; } if(charASCII < 0 || charASCII > 126) return true; String charStr = Character.toString(str); Character.UnicodeBlock ub = Character.UnicodeBlock.of(str); if (ub == Character.UnicodeBlock.GENERAL_PUNCTUATION || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_FORMS || ub == Character.UnicodeBlock.VERTICAL_FORMS) { //jdk1.7 return true; } return false; } public static void drawVertical2Text(Canvas canvas, String textString,int textColor,int fontSize,int ixpos,int iypos) { Paint paint = new Paint(); paint.setColor(textColor); paint.setTextSize(fontSize); paint.setStyle(Paint.Style.FILL); float a = paint.measureText("正正", 0, 1); float left = ixpos;// canvas.getWidth()/2-a/2; float w; final int len = textString.length(); float py = iypos;// 0 ; Path path = new Path(); path.moveTo(ixpos,py); path.lineTo(0,500); String strChar = ""; float fstYpos = 0; float fedYpos = 0; for(int i=0; i<len; i ++){ char c = textString.charAt(i); w = paint.measureText(textString, i, i+1);//获取字符宽度 //... Log.d(TAG,"tongfei ---w= "+w); StringBuffer b = new StringBuffer(); b.append(c); if(py > canvas.getHeight()){//定义字的范围 return; } if(isChinese(c)){ if(strChar.length() > 0){ Path path1 = new Path(); path1.moveTo(left,fstYpos); path1.lineTo(left,fedYpos); canvas.drawTextOnPath(strChar, path1, 0, 0, paint); strChar = ""; } py += w; if(py > canvas.getHeight()){ return; } canvas.drawText(b.toString(), left, py, paint); //中文处理方法 }else { if(strChar.length() <= 0){ fstYpos = py; fedYpos = py; strChar = b.toString(); }else{ fedYpos = py; strChar = strChar+b.toString(); } py += w; } } if(strChar.length() > 0){ Path path1 = new Path(); path1.moveTo(left,fstYpos); path1.lineTo(left,fedYpos); canvas.drawTextOnPath(strChar, path1, 0, 0, paint); strChar = ""; } } public static void drawVerticalText(Canvas canvas, Paint paint,String textString,int textColor,int fontSize) { TextPaint textPaint=new TextPaint(); textPaint.setColor(textColor); textPaint.setTextSize(fontSize); float[] widths = new float[1]; paint.getTextWidths("正", widths);//获取单个汉字的宽度 int LineWidth = (int) Math.ceil(widths[0] * 1.01);// + 2); StaticLayout staticLayout=new StaticLayout(textString, textPaint, LineWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); //绘制的位置 canvas.translate(285, 220); staticLayout.draw(canvas); } public static void drawARROW(Canvas canvas,int sx, int sy, int ex, int ey,int curColorv,int icLinewd) { int ixoff = ex-sx; int iyoff = ey-sy; double arraow_Linelen = Math.sqrt(ixoff * ixoff + iyoff * iyoff); double H = arraow_Linelen/4;// mdrawLinewide;//xxx 8; // 箭头高度 double L = H*0.45;// 3.5; // 底边的一半 int x3 = 0; int y3 = 0; int x4 = 0; int y4 = 0; double awrad = Math.atan(L / H); // 箭头角度 double arraow_len = Math.sqrt(L * L + H * H); // 箭头的长度 double[] arrXY_1 = rotateVec(ex - sx, ey - sy, awrad, true, arraow_len); double[] arrXY_2 = rotateVec(ex - sx, ey - sy, -awrad, true, arraow_len); double x_3 = ex - arrXY_1[0]; // (x3,y3)是第一端点 double y_3 = ey - arrXY_1[1]; double x_4 = ex - arrXY_2[0]; // (x4,y4)是第二端点 double y_4 = ey - arrXY_2[1]; Double X3 = new Double(x_3); x3 = X3.intValue(); Double Y3 = new Double(y_3); y3 = Y3.intValue(); Double X4 = new Double(x_4); x4 = X4.intValue(); Double Y4 = new Double(y_4); y4 = Y4.intValue(); if(icLinewd < 1) icLinewd = 1; Paint paint = new Paint(); paint.setStyle(Paint.Style.STROKE); paint.setStrokeCap(Paint.Cap.ROUND); paint.setAntiAlias(true); // 去锯齿 paint.setColor(curColorv); paint.setStrokeWidth(icLinewd); // 画线 canvas.drawLine(sx, sy, ex, ey,paint); canvas.drawLine(x3, y3, ex, ey,paint); canvas.drawLine(x4, y4, ex, ey,paint); } // 计算 private static double[] rotateVec(int px, int py, double ang, boolean isChLen, double newLen) { double mathstr[] = new double[2]; // 矢量旋转函数,参数含义分别是x分量、y分量、旋转角、是否改变长度、新长度 double vx = px * Math.cos(ang) - py * Math.sin(ang); double vy = px * Math.sin(ang) + py * Math.cos(ang); if (isChLen) { double d = Math.sqrt(vx * vx + vy * vy); vx = vx / d * newLen; vy = vy / d * newLen; mathstr[0] = vx; mathstr[1] = vy; } return mathstr; } }
四,应用实例简介
这是一个应用自定 RelativeLayout 实现的专用图片编辑界面(Fragment_PictureEdit)。通过这个界面可以选择相册中的图片进行编辑。这里重点是展示如何设置自定RelativeLayout的操作菜单(buildPictureEditButton()),如何通过回调(Callback)设置控制参数(标记形状,颜色等)。
1),Layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/maintimeask_LLayout" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/timetaskColor_mainbg" android:weightSum="100" tools:context="com.bi3eview.newstart60.local.PictureEdit.Fragment_PictureEdit"> <!-- Information ............................................................................--> <LinearLayout android:id="@+id/taskInfo_LAYOUT" android:layout_weight="4" android:layout_width="match_parent" android:layout_height="0dp" android:gravity="center_vertical" android:orientation="horizontal" android:background="@color/doTaskColor_infobg" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:gravity="left" android:textColor="@color/fragPictureEditColor_infoTitle" android:textSize="@dimen/fragPictureEditSize_infoTitle" android:text="@string/fragpictureedit_infoTitle" /> <TextView android:id="@+id/operMsg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:textColor="@color/fragPictureEditColor_operInfo" android:textSize="@dimen/fragPictureEditSize_operInfo" android:text="" /> </LinearLayout> <!-- head ..................................................................................--> <LinearLayout android:gravity="center" android:id="@+id/eventtask_topview" android:layout_weight="9" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginLeft="3dp" android:layout_marginRight="3dp" android:orientation="horizontal" android:weightSum="100"> <LinearLayout android:id="@+id/Layoutbut_Album" android:layout_width="0dp" android:layout_height="36dp" android:gravity="center" android:layout_weight="20" android:background="@drawable/combutton_layoutbg" android:orientation="horizontal"> <ImageView android:id="@+id/imgbut_Album" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" android:tint="@color/blue" android:src="@drawable/comvec_album" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:textColor="@color/tableheadColor1_topvtxt" android:text="@string/cyberTaskbut_ALBUM" android:textSize="@dimen/timetaskbut_text" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="36dp" android:gravity="center" android:layout_weight="2" android:orientation="horizontal"> </LinearLayout> <LinearLayout android:id="@+id/Layoutbut_EMPTY" android:layout_width="0dp" android:layout_height="28dp" android:gravity="center" android:layout_weight="13" android:background="@drawable/combutton_layoutside" android:orientation="horizontal"> <TextView android:id="@+id/edtpic_EMPTY" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_weight="20" android:textColor="@color/doTaskColor_botbutxt" android:text="" android:textSize="@dimen/finishTask_bottomfbtsize" /> </LinearLayout> <LinearLayout android:id="@+id/Layoutbut_SAVE" android:layout_width="0dp" android:layout_height="36dp" android:gravity="center" android:layout_weight="20" android:background="@drawable/combutton_layoutbg" android:orientation="horizontal"> <ImageView android:id="@+id/imgbut_mparYES" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="15" android:gravity="right" android:tint="@color/yellow" android:src="@drawable/comvec_savedata" /> <TextView android:id="@+id/txtyes_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" android:layout_weight="15" android:textColor="@color/tableheadColor1_topvtxt" android:text="@string/fragpictureedit_saveEdit" android:textSize="@dimen/timetaskbut_text" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="36dp" android:gravity="center" android:layout_weight="2" android:orientation="horizontal"> </LinearLayout> <LinearLayout android:id="@+id/Layoutbut_CLIPYES" android:layout_marginTop="3dp" android:layout_width="0dp" android:layout_height="46dp" android:gravity="center" android:layout_weight="29" android:orientation="vertical"> <CheckBox android:id="@+id/chk_clipyes" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="@dimen/finishTask_botpritxt" android:saveEnabled="false" android:textColor="@color/doTaskColor_botchkubkg" android:text="@string/fragpictureedit_pictureClip" /> </LinearLayout> <LinearLayout android:layout_width="0dp" android:layout_height="36dp" android:gravity="center" android:layout_weight="2" android:orientation="horizontal"> </LinearLayout> <LinearLayout android:id="@+id/Layoutbut_PICNUM" android:layout_width="0dp" android:layout_height="28dp" android:gravity="center" android:layout_weight="10" android:background="@drawable/combutton_layoutside" android:orientation="horizontal"> <TextView android:id="@+id/edtpic_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_weight="20" android:textColor="@color/fragPictureEditColor_picNum" android:text="" android:textSize="@dimen/fragPictureEditSize_picnum" /> </LinearLayout> </LinearLayout> <!-- 自定RelativeLayout ..........--> <com.bi3eview.newstart60.local.doTask.TaskDataLLayout android:id="@+id/Layout_taskDataLst" android:layout_weight="86" android:layout_width="match_parent" android:layout_height="0dp" android:background="@color/darkWhite" android:orientation="vertical"> </com.bi3eview.newstart60.local.doTask.TaskDataLLayout> <!-- bottom line ............................................................................--> <LinearLayout android:id="@+id/bottom_LLayout" android:gravity="center" android:layout_weight="1" android:layout_width="fill_parent" android:layout_marginLeft="3dp" android:layout_marginRight="3dp" android:orientation="horizontal" android:weightSum="100" android:layout_height="0dp" > </LinearLayout> </LinearLayout>
2), Fragment 代码
package com.bi3eview.newstart60.local.PictureEdit; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import static android.app.Activity.RESULT_OK; import com.bi3eview.newstart60.local.COMCONST; import com.bi3eview.newstart60.local.JavaLoadCppLib.ActEventDataClass; import com.bi3eview.newstart60.local.R; import com.bi3eview.newstart60.local.SelfWidget.ComboxItem; import com.bi3eview.newstart60.local.SelfWidget.PopupWindowCombox; import com.bi3eview.newstart60.local.SelfWidget.PopupWindowDlg; import com.bi3eview.newstart60.local.Util.GraphicItemUtil; import com.bi3eview.newstart60.local.Util.buttonData; import com.bi3eview.newstart60.local.Util.buttonDrawUtil; import com.bi3eview.newstart60.local.constant.Constants; import com.bi3eview.newstart60.local.doTask.TaskDataLLayout; import com.bi3eview.newstart60.local.fragmentSimple.ICallBack; import com.bi3eview.newstart60.local.pubcom.GraphicsSetDlgClip; import com.bi3eview.newstart60.local.pubcom.GraphicsSetDlgMark; import com.bi3eview.newstart60.local.pubcom.GraphicsSetDlgText; import java.io.ByteArrayOutputStream; import java.util.ArrayList; import java.util.List; /** * Created by bs60 on 2022.09.21 */ public class Fragment_PictureEdit extends Fragment { Context mContext = null; private View mView; Bundle bundle = null; ICallBack callback; // private int mphoto_EDITPICMODE = 0; // private TaskDataLLayout mTaskDataLayout = null; LinearLayout mtop_LLayoutButAlbum; LinearLayout mtop_LLayoutButEmpty; LinearLayout mtop_LLayoutButSave; LinearLayout mtop_LLayoutButPicNum; CheckBox mchk_clipPicture; TextView medtpic_num; TextView m_operInfo; private String muri_strPhotoname = null; private String mapp_uriTasktmpPhotoname = null; boolean mcapture_photoblv = false; boolean msave_ProcessLockblv = false; int mcurEdtPicNum = 0; Bitmap mphoto_bipmap; // graphics parameter kind final int GRAPHICSPARASET_CLIP = 1; final int GRAPHICSPARASET_TEXT = 2; final int GRAPHICSPARASET_DRAW = 3; final int EDITPICTURE_GETSUBDIR = 100; final int EDITPICTURE_GETTIMENAME = 101; final int EDITPICTURE_GETFILENUM = 102; final int EDITPICTURE_DELETEFILE = 104; // private final int REQUESTCODE_ALBUM = 3; // handler final int RESETPHOTOVIEW = 1000; final int BUILDPICTUREBUTTON = 1006; final int GRAPHICSPARASETDLG = 1007; final int BUTTONOPERINFO = 2000; final int COMMONTOASTINFO = 2001; final int PICTURESAVEEDIT = 2002; final int EDITPICTUREDIRFILE = 2003; final int DOEXEDELEDITPICTURE = 2004; private Handler handler = new Handler() { public void handleMessage(Message msg) { String strInfoj; switch (msg.what) { case DOEXEDELEDITPICTURE: doexeDELEditPic(); break; case EDITPICTUREDIRFILE: EditPictureDelete(); break; case PICTURESAVEEDIT: SaveEditPicture(); break; case COMMONTOASTINFO: strInfoj = (String) msg.obj; COMCONST.ToastCenterImage(mContext,strInfoj,R.drawable.comvec_err, Toast.LENGTH_LONG,Color.RED); break; case BUTTONOPERINFO: strInfoj = (String) msg.obj; m_operInfo.setText(strInfoj); break; case GRAPHICSPARASETDLG: int igraKind = (int)msg.obj; graEditSetPara(igraKind); break; case BUILDPICTUREBUTTON: buildPictureEditButton(); mTaskDataLayout.dataShowSet(false); mTaskDataLayout.invalidate(); break; case RESETPHOTOVIEW: if(mTaskDataLayout != null && muri_strPhotoname.length() > 1){ mphoto_bipmap = BitmapFactory.decodeFile(muri_strPhotoname);// BitmapFactory.decodeStream(fis); int iwidthv = mphoto_bipmap.getWidth(); int iheightv = mphoto_bipmap.getHeight(); mTaskDataLayout.updateSetPhotoBitmap(mphoto_bipmap); mTaskDataLayout.invalidate(); mtop_LLayoutButSave.setVisibility(View.VISIBLE); } break; } } }; // public Fragment_PictureEdit() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment mView = inflater.inflate(R.layout.fragment_picture_edit, container, false); mtop_LLayoutButAlbum = (LinearLayout) mView.findViewById(R.id.Layoutbut_Album); mtop_LLayoutButEmpty = (LinearLayout) mView.findViewById(R.id.Layoutbut_EMPTY); mtop_LLayoutButEmpty.setVisibility(View.INVISIBLE); mtop_LLayoutButSave = (LinearLayout) mView.findViewById(R.id.Layoutbut_SAVE); mtop_LLayoutButPicNum = (LinearLayout) mView.findViewById(R.id.Layoutbut_PICNUM); mTaskDataLayout = (TaskDataLLayout) mView.findViewById(R.id.Layout_taskDataLst); medtpic_num = (TextView) mView.findViewById(R.id.edtpic_num); m_operInfo = (TextView) mView.findViewById(R.id.operMsg); m_operInfo.setText("...");// Welcome To Beijing!"); mchk_clipPicture = (CheckBox) mView.findViewById(R.id.chk_clipyes); mTaskDataLayout.setOnItemClickCallback(new TaskDataLLayout.Callback() { @Override public void onItemClick(int position, int jno) { } }); mTaskDataLayout.setOnButtonClickCallback(new TaskDataLLayout.buttonCallback() { @Override public void onButtonClick(byte buttonIDno, int ixoff,int iyoff,boolean doOper) { String strInfo = ""; if(buttonIDno == buttonData.BUTTONIDNO_RESTORE){ strInfo = getResources().getString(R.string.pictureEditButton_Restore); } // if(doOper){// do operation if (buttonIDno == buttonData.BUTTONIDNO_PARASET) { // 回调处理参数设置 if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_CLIP){ Message mcMsg = new Message(); mcMsg.obj = GRAPHICSPARASET_CLIP; mcMsg.what = GRAPHICSPARASETDLG; handler.sendMessage(mcMsg); } if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_TEXT){ Message mcMsg = new Message(); mcMsg.obj = GRAPHICSPARASET_TEXT; mcMsg.what = GRAPHICSPARASETDLG; handler.sendMessage(mcMsg); } if(buttonData.cActive_IDitem == buttonData.BUTTONIDNO_RUBBER){ Message mcMsg = new Message(); mcMsg.obj = GRAPHICSPARASET_DRAW; mcMsg.what = GRAPHICSPARASETDLG; handler.sendMessage(mcMsg); } } if (buttonIDno == buttonData.BUTTONIDNO_SAVE) { //... handler.sendEmptyMessage(SAVEEDITIMAGEOPER); } }else {// help information if (buttonIDno == buttonData.BUTTONIDNO_CLIP) { strInfo = getResources().getString(R.string.pictureEditButton_Clip); } if (buttonIDno == buttonData.BUTTONIDNO_RUBBER) { strInfo = getResources().getString(R.string.pictureEditButton_Rubber); } if (buttonIDno == buttonData.BUTTONIDNO_TEXT) { strInfo = getResources().getString(R.string.pictureEditButton_Text); } if (buttonIDno == buttonData.BUTTONIDNO_DELETE) { strInfo = getResources().getString(R.string.pictureEditButton_Delete); } if (buttonIDno == buttonData.BUTTONIDNO_DRAGMOVE) { strInfo = getResources().getString(R.string.pictureEditButton_DragMove); } if (buttonIDno == buttonData.BUTTONIDNO_SAVE) { strInfo = getResources().getString(R.string.pictureEditButton_Save); } if (buttonIDno == buttonData.BUTTONIDNO_SAVE_REINFO) { //... strInfo = getResources().getString(R.string.pictureEditButton_SaveReinfo); } if (buttonIDno == buttonData.BUTTONIDNO_PARASET) { strInfo = getResources().getString(R.string.pictureEditButton_Paraset); } } if(strInfo.length() > 0){ //... mShowOffvPoint.x = ixoff; //... mShowOffvPoint.y = iyoff; Message msg = new Message(); msg.obj = strInfo; msg.what = BUTTONOPERINFO; handler.sendMessage(msg); } } }); mcapture_photoblv = false; msave_ProcessLockblv = false; getDotaskFilePathName(); setClickListenar(); commonBusyWaitThread waitThread = new commonBusyWaitThread(handler,"12345" ,BUILDPICTUREBUTTON,1); Thread thread = new Thread(waitThread, "BusyWait61"); thread.start(); return mView; } @Override public void onAttach(Context context) { super.onAttach(context); mContext = context; } @Override public void onDetach() { super.onDetach(); mContext = null; } private void setClickListenar() { mchk_clipPicture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { } }); mtop_LLayoutButPicNum.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { handler.sendEmptyMessage(EDITPICTUREDIRFILE); return true; } }); mtop_LLayoutButAlbum.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent cintent = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); // 设定结果返回 startActivityForResult(cintent, REQUESTCODE_ALBUM); } }); mtop_LLayoutButSave.setVisibility(View.INVISIBLE); mtop_LLayoutButSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mTaskDataLayout.checkGraItemNum() <= 0){ Message msg = new Message(); msg.what = COMMONTOASTINFO; msg.obj = getResources().getString(R.string.fragpictureedit_notEditItem); handler.sendMessage(msg); }else{ boolean passblv = true; if(mchk_clipPicture.isChecked()){ if(mTaskDataLayout.checkGraClipItemNum() <= 0){ passblv = false; Message msg = new Message(); msg.what = COMMONTOASTINFO; msg.obj = getResources().getString(R.string.fragpictureedit_notClipArea); handler.sendMessage(msg);; } } if(!msave_ProcessLockblv && passblv){ msave_ProcessLockblv = true; handler.sendEmptyMessage(PICTURESAVEEDIT); } } } }); } // 设置自定RelativeLayout的操作菜单 private void buildPictureEditButton() { String pkName = ""; mcurEdtPicNum = 0; if(mTaskDataLayout != null){ int iLayoutWidth = mTaskDataLayout.GetCanvasWidth(); int iLayoutHeight = mTaskDataLayout.GetCanvasHeight(); buttonData cbutData = new buttonData(); String bName = ""; int iButtonNum = 6;// 8+1+2; int buttonWide = 60; int buttonSpace = 30; int iwide = iLayoutWidth/iButtonNum; buttonSpace = iwide/3; buttonWide = buttonSpace*2; int iLeft = buttonWide/2;// 20; int iTop = buttonWide/2; float fcurScale = buttonWide/60f; float fscale = 1.7f*fcurScale; int ixoffv = (int)(8*fcurScale); int iyoffv = (int)(8*fcurScale); int iRight = iLeft+buttonWide; int iBottom = iTop+buttonWide; GraphicItemUtil.mbutWide = buttonWide; mTaskDataLayout.setButtonWide(buttonWide); mTaskDataLayout.setGraphicsItemMarkPara(fscale,(float)buttonWide,ixoffv,iyoffv); GraphicItemUtil.mgraItem_MarkFscale = fscale; GraphicItemUtil.mgraItem_Xoff = ixoffv; GraphicItemUtil.mgraItem_Yoff = iyoffv; // restore 1 String strButPath = COMCONST.EDITBUTTON_RESTORE; cbutData.setButtonPath(buttonData.BUTTONKIND_OVAL,buttonData.BUTTONIDNO_RESTORE, bName,iLeft,iTop,iRight,iBottom,fscale,strButPath,ixoffv,iyoffv,Color.BLUE); mTaskDataLayout.appendEditButton(cbutData); // clip 2 int picItemColor = Color.argb(255,11,128,11); iLeft = iRight+buttonSpace; iRight = iLeft+buttonWide; strButPath = COMCONST.EDITBUTTON_CLIP; buttonDrawUtil.mSpotLightBmp = BitmapFactory.decodeResource(getResources(), R.drawable.grabutton_spotlightclip); buttonDrawUtil.mDragMoveBmp = BitmapFactory.decodeResource(getResources(), R.drawable.grabutton_dragmove); buttonData cbutData1 = new buttonData(); cbutData1.setButtonPath(buttonData.BUTTONKIND_OVAL,buttonData.BUTTONIDNO_CLIP, bName,iLeft,iTop,iRight,iBottom,fscale,strButPath,ixoffv,iyoffv,picItemColor); mTaskDataLayout.appendEditButton(cbutData1); // text 3 iLeft = iRight+buttonSpace; iRight = iLeft+buttonWide; strButPath = COMCONST.EDITBUTTON_TEXT; buttonData cbutData2 = new buttonData(); cbutData2.setButtonPath(buttonData.BUTTONKIND_OVAL,buttonData.BUTTONIDNO_TEXT, bName,iLeft,iTop,iRight,iBottom,fscale,strButPath,ixoffv,iyoffv,picItemColor); mTaskDataLayout.appendEditButton(cbutData2); // rubber 4 iLeft = iRight+buttonSpace; iRight = iLeft+buttonWide; strButPath = COMCONST.EDITBUTTON_RUBBER; buttonData cbutData3 = new buttonData(); cbutData3.setButtonPath(buttonData.BUTTONKIND_OVAL,buttonData.BUTTONIDNO_RUBBER, bName,iLeft,iTop,iRight,iBottom,fscale,strButPath,ixoffv,iyoffv,picItemColor); mTaskDataLayout.appendEditButton(cbutData3); // parameter set 5 int paraSetColor = Color.argb(255,128,128,11); iLeft = iRight+buttonSpace; iRight = iLeft+buttonWide; strButPath = COMCONST.EDITBUTTON_PARASET; buttonData cbutData3b = new buttonData(); cbutData3b.setButtonPath(buttonData.BUTTONKIND_OVAL,buttonData.BUTTONIDNO_PARASET, bName,iLeft,iTop,iRight,iBottom,fscale,strButPath,ixoffv,iyoffv,paraSetColor); mTaskDataLayout.appendEditButton(cbutData3b); // 换行 ------------------------------------ iLeft = buttonWide/2; iRight = iLeft+buttonWide; iTop = iBottom+buttonSpace; iBottom = iTop+buttonWide; // delete 6 strButPath = COMCONST.EDITBUTTON_DELETE; buttonData cbutData4 = new buttonData(); cbutData4.setButtonPath(buttonData.BUTTONKIND_OVAL,buttonData.BUTTONIDNO_DELETE, bName,iLeft,iTop,iRight,iBottom,fscale,strButPath,ixoffv,iyoffv,Color.RED); mTaskDataLayout.appendEditButton(cbutData4); // draw move iLeft = iRight+buttonSpace; iRight = iLeft+buttonWide; strButPath = COMCONST.EDITBUTTON_UNDO; buttonData cbutData5 = new buttonData(); cbutData5.setButtonPath(buttonData.BUTTONKIND_OVAL,buttonData.BUTTONIDNO_DRAGMOVE, bName,iLeft,iTop,iRight,iBottom,fscale,strButPath,ixoffv,iyoffv,Color.BLACK); mTaskDataLayout.appendEditButton(cbutData5); buttonDrawUtil.mButtonResetblv = true; try { //包名 pkName = mContext.getPackageName(); mTaskDataLayout.setAppPackageName(pkName); } catch (Exception e) { } } // int[] daparv = new int[18]; byte[] tmpRbyteArr = new byte[266]; int iretcn = ActEventDataClass.JavaJNIgetSetEditPictureData_onSharebook(EDITPICTURE_GETSUBDIR, daparv, -1, tmpRbyteArr, 260); if(iretcn > 0){ String strEdtDir = new String(tmpRbyteArr, 0, iretcn); mTaskDataLayout.SetEditPictureFiledir(strEdtDir); } // iretcn = ActEventDataClass.JavaJNIgetSetEditPictureData_onSharebook(EDITPICTURE_GETFILENUM, daparv, -1, tmpRbyteArr, 260); if(iretcn > 0) { mcurEdtPicNum = iretcn; String strPicNum = String.valueOf(iretcn); medtpic_num.setText(strPicNum); } if (mcurEdtPicNum <= 0) { mtop_LLayoutButPicNum.setVisibility(View.INVISIBLE); } if(mTaskDataLayout != null){ mphoto_bipmap = BitmapFactory.decodeResource(getResources(), R.drawable.drawplate); mTaskDataLayout.updateSetPhotoBitmap(mphoto_bipmap); mTaskDataLayout.invalidate(); mtop_LLayoutButSave.setVisibility(View.VISIBLE); } } private void doexeDELEditPic() { int[] daparv = new int[18]; byte[] tmpRbyteArr = new byte[266]; int iretcn = ActEventDataClass.JavaJNIgetSetEditPictureData_onSharebook(EDITPICTURE_DELETEFILE, daparv, -1, tmpRbyteArr, 260); if(iretcn > 0){ mtop_LLayoutButPicNum.setVisibility(View.INVISIBLE); }; } private void EditPictureDelete() { if(mcurEdtPicNum > 0) { String strTitle = mContext.getResources().getString(R.string.fragpictureedit_deletePic) + "(" + String.valueOf(mcurEdtPicNum) + ")?"; PopupWindowDlg curDlg = new PopupWindowDlg((Activity) mContext, strTitle); curDlg.setOnWinButtonClickListener(new PopupWindowDlg.OnWinButtonClickListener() { @Override public void onWindButtonClick(int butcd, String menuName) { if (butcd == 9) { handler.sendEmptyMessage(DOEXEDELEDITPICTURE); } } }); curDlg.showAtScreen(mtop_LLayoutButSave, COMCONST.LocationType.PARENT_CENTER); }else{ mtop_LLayoutButPicNum.setVisibility(View.INVISIBLE); } } private void SaveEditPicture() { mtop_LLayoutButSave.setVisibility(View.INVISIBLE); boolean clipblv = mchk_clipPicture.isChecked(); String strTimeFilename = "20220626_280818"; int[] daparv = new int[18]; byte[] tmpRbyteArr = new byte[266]; int iretcn = ActEventDataClass.JavaJNIgetSetEditPictureData_onSharebook(EDITPICTURE_GETTIMENAME, daparv, -1, tmpRbyteArr, 260); if(iretcn > 0){ strTimeFilename = new String(tmpRbyteArr, 0, iretcn); } mTaskDataLayout.SAVEINITRESET(strTimeFilename); String newPicname = mTaskDataLayout.SaveEditPicture(clipblv); if(newPicname.length() > 0){ mphoto_bipmap = BitmapFactory.decodeFile(newPicname); mTaskDataLayout.updateSetPhotoBitmap(mphoto_bipmap); mTaskDataLayout.invalidate(); } msave_ProcessLockblv = false; //... mtop_LLayoutButSave.setVisibility(View.VISIBLE); } private void graEditSetPara(int igraKind) { Activity activity = (Activity) mContext; if(igraKind == GRAPHICSPARASET_CLIP) { GraphicsSetDlgClip clipParaSetDlg = new GraphicsSetDlgClip(activity, ""); clipParaSetDlg.setOnWinButtonClickListener(new GraphicsSetDlgClip.OnWinButtonClickListener() { @Override public void onWindButtonClick(int butcd, byte bkind, int iColor,int iTransparent) { if (butcd == 9) { mTaskDataLayout.updateSetClip(bkind, iColor,iTransparent); } } }); clipParaSetDlg.showAtScreen(mtop_LLayoutButAlbum, COMCONST.LocationType.LEFT_BOTTOM); } if(igraKind == GRAPHICSPARASET_TEXT) { GraphicsSetDlgText textParaSetDlg = new GraphicsSetDlgText(activity, ""); textParaSetDlg.setOnWinButtonClickListener(new GraphicsSetDlgText.OnWinButtonClickListener() { @Override public void onWindButtonClick(int butcd, byte bkind, int iColor,int ifntsize,String markName) { if (butcd == 9) { mTaskDataLayout.updateSetText(bkind, iColor,ifntsize,markName); } } }); textParaSetDlg.showAtScreen(mtop_LLayoutButAlbum, COMCONST.LocationType.LEFT_BOTTOM); } if(igraKind == GRAPHICSPARASET_DRAW) { GraphicsSetDlgMark markParaSetDlg = new GraphicsSetDlgMark(activity, ""); markParaSetDlg.setOnWinButtonClickListener(new GraphicsSetDlgMark.OnWinButtonClickListener() { @Override public void onWindButtonClick(int butcd, byte bkind, int iColor,int iLinewide,int iTransparentv) { if (butcd == 9) { mTaskDataLayout.updateSetDraw(bkind, iColor,iLinewide,iTransparentv); } } }); markParaSetDlg.showAtScreen(mtop_LLayoutButAlbum, COMCONST.LocationType.LEFT_BOTTOM); } } private String getDotaskFilePathName() { String taskPath = ""; byte[] tmpRbyteArr = new byte[266]; int[] daparv = new int[9]; int iretcn = ActEventDataClass.JavaJNIgetOnTimeTaskParaInfo(20200128, daparv, -1, tmpRbyteArr, 262); if(iretcn > 0){ String strDirpath = new String(tmpRbyteArr, 0, iretcn); taskPath = strDirpath;// +"/taskphototmp.jpg"; muri_strPhotoname = taskPath; mapp_uriTasktmpPhotoname = taskPath; //... mdo_CameraAlibumPicName = taskPath; } return taskPath; } private void updateSetCameraPhotoQuality(String qualityName) { int icQualityVal = -1; int icModeVal = -1; String cqualityName = getResources().getString(R.string.cameraphoto_quality100); if(qualityName.equals(cqualityName)) icQualityVal = 100; if(icQualityVal < 0){ cqualityName = getResources().getString(R.string.cameraphoto_quality200); if(qualityName.equals(cqualityName)) icQualityVal = 200; } if(icQualityVal < 0){ cqualityName = getResources().getString(R.string.cameraphoto_quality300); if(qualityName.equals(cqualityName)) icQualityVal = 300; } if(icQualityVal < 0){ cqualityName = getResources().getString(R.string.cameraphoto_quality000); if(qualityName.equals(cqualityName)) icQualityVal = 0; } if(icQualityVal >= 0 && icQualityVal != COMCONST.mc_cameraPhotoQuality){// && COMCONST.mcom_SharedPreferences != null) { Constants.SharedPerferenceData.updateSetIntSharedPerference(Constants.SharedPerferenceData.SP_KEY_CAMERAPHOTOQUALITY, icQualityVal); COMCONST.mc_cameraPhotoQuality = icQualityVal; } // capture mode if(icQualityVal < 0){ String cModeName = getResources().getString(R.string.cameraphoto_REDATA); if(qualityName.equals(cModeName)) icModeVal = COMCONST.CAPTURE_PHOTO_MODE_RETDATA; if(icModeVal < 0){ cModeName = getResources().getString(R.string.cameraphoto_MOBILE); if(qualityName.equals(cModeName)) icModeVal = COMCONST.CAPTURE_PHOTO_MODE_RESOLVER; } if(icModeVal < 0){ cModeName = getResources().getString(R.string.cameraphoto_APPCAPTUE); if(qualityName.equals(cModeName)) icModeVal = COMCONST.CAPTURE_PHOTO_MODE_HOMEGROWN ; } if(icModeVal > 0 && icModeVal != COMCONST.mcamera_PHOTOMODE && COMCONST.mcom_SharedPreferences != null){ SharedPreferences.Editor editor = COMCONST.mcom_SharedPreferences.edit(); editor.putInt(Constants.SharedPerferenceData.SP_KEY_EDITPICSIZEMODE, icModeVal); COMCONST.mcamera_PHOTOMODE = icModeVal; mphoto_EDITPICMODE = COMCONST.mcamera_PHOTOMODE; editor.commit(); } } } private boolean savePhotoImage(Bitmap image) { boolean blretv = false; ByteArrayOutputStream bmpByteStream = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, bmpByteStream); byte[] bmpBytes = bmpByteStream.toByteArray(); int[] daparv = new int[8]; int iretv = ActEventDataClass.JavaJNIgetOnTimeTaskParaInfo(20200603, daparv, -1, bmpBytes, bmpBytes.length); if(iretv > 0) blretv = true; return blretv; } class commonBusyWaitThread implements Runnable { Handler mTHandler; String waitNo; int iWHATval = -1; int iWaitMilliSecond = 1000; public commonBusyWaitThread(Handler handler,String waitName,int iWhatv,int iWaitTimems) { this.mTHandler = handler; this.waitNo = waitName; this.iWHATval = iWhatv; this.iWaitMilliSecond = iWaitTimems; if(iWaitTimems < 120) this.iWaitMilliSecond = iWaitTimems*1000; } @Override public void run() { synchronized (waitNo) { try { Thread.sleep(iWaitMilliSecond);// 1.5 second } catch (InterruptedException e) { e.printStackTrace(); } Message msg = new Message(); msg.what = iWHATval; msg.obj = waitNo; handler.sendMessage(msg); } }; } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { mcapture_photoblv = false; super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUESTCODE_ALBUM && resultCode == RESULT_OK) {// select photo alibum if (data != null) { Uri uri = data.getData(); try { Bitmap bitmap = BitmapFactory.decodeStream(mContext.getContentResolver().openInputStream(uri)); if (savePhotoImage(bitmap)) { mcapture_photoblv = true; } } catch (Exception e) { e.printStackTrace(); /* Message msgErr = new Message(); msgErr.obj = getResources().getString(R.string.finishTaskInfo_alibumErr); msgErr.what = COMMONTOASTSHOW; handler.sendMessage(msgErr); */ } } } // final if(mcapture_photoblv == true) { if (muri_strPhotoname.length() > 1) { Message msg = new Message(); msg.what = RESETPHOTOVIEW; msg.obj = "data"; handler.sendMessage(msg); } } } // 设置 接口回调 方法 public void sendMessage(ICallBack callBack){ this.callback = callBack; } // Receive message - activity to fragment public void receiveMsg(int msgcd,String msg) { if (msgcd == 210830) { } } }
标签:RelativeLayout,get,--,APP,buttonData,int,import,new,public From: https://www.cnblogs.com/newstart60/p/16992471.html