gpt4 book ai didi

android - 如何在imageview中获取图像边缘x/y位置

转载 作者:IT王子 更新时间:2023-10-28 23:34:08 25 4
gpt4 key购买 nike

如果我有一个填满屏幕的 ImageView。
ImageView 背景设置为绿色。
我在 ImageView 中放置了一个位图,保持位图比例。

此布局中的纵向照片将在左侧和右侧显示绿色
(手机方向=纵向)。

现在,当绿色结束并且位图开始时,我如何获得边缘的左侧 x/y 位置。

这个努力项目的背景是我想在图像上写文本并将图像保存回带有文本的新图像。问题是..

由于我将图像缩放为 inSampleSize = 4;并且 ImageView 进一步缩小它,保存这张新图片将给出一个大约 250x350 的小图像。

我想要的是使用 x/y 位置并将书面文本传输到原始 inSampleSize = 4 图像或 sdcard 1500x3000 图像

我知道并阅读过其他有关我必须自己“进行数学计算”的问题我只需要这个小答案。

我忘了我可以截图澄清一下。

这就是它的样子:(按下“笔”按钮我得到一支新笔,每支笔都有自己独特的文本和屏幕上的位置

enter image description here

这是 ImageView

    import java.util.HashMap;
import java.util.UUID;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.util.AttributeSet;
import android.view.Display;
import android.view.MotionEvent;
import android.widget.EditText;
import android.widget.ImageView;

public class DrawView2 extends ImageView {

private HashMap<String, ColorBall2> HashBall ;
private String balID = ""; // variable to know what ball is being dragged
public final String PTPPSERVICE_DERECTORY = "/PTPPservice/";
private Bitmap bitmap;
private EditText ed;
private Paint paint = new Paint();
private Paint paint2 = new Paint();
private Paint pTouch = new Paint();
private EditText addtext;
private Context ctx;
private String imagePath;
private boolean removeBall = false;
int viewWidth = 0;
int viewHeight = 0;
double bitmapHight =0;
double bitmapWidth =0;
double ratio =0;

double startX = 0;
double endX= 0;
double startY= 0;
double endY = 0;

public DrawView2(Context context, AttributeSet atts,String image1) {

super(context, atts);
this.ctx = context;
this.imagePath = image1;
setFocusable(true);

paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setColor(Color.BLACK);
paint.setTypeface(Typeface.DEFAULT_BOLD);

paint2.setStyle(Paint.Style.FILL_AND_STROKE);
paint2.setColor(Color.RED);

addtext = (EditText) ((Activity) ctx).findViewById(R.id.edittextaddtext);

String filePath = Environment.getExternalStorageDirectory().toString() + imagePath;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;

bitmap = BitmapFactory.decodeFile(filePath,options);
// SAVE RATIO
int x = bitmap.getWidth();
int y = bitmap.getHeight();
if(y>x)
ratio = ((double)y)/x;
if(x>y)
ratio = ((double)x)/y;
if(y==x)
ratio = 1;
Drawable bit = new BitmapDrawable(bitmap);
setImageDrawable(bit);

}
public double getRatio() {
return ratio;
}
public HashMap<String, ColorBall2> getHashBall() {
return HashBall;
}
// RETURN THE ON SCREEN RESIZED BITMAP
public double getOnScreenBitmapHight(){

return bitmapHight;
}
public double getOnScreenBitmapWidth(){

return bitmapWidth;
}
// BITMAP SIZE
public int getBitmapHight(){

return bitmap.getHeight();
}
public int getBitmapWidth(){

return bitmap.getWidth();
}
// GET IMAGEVIEW HIGHT WIDTH
public int getViewWidth() {
return viewWidth;
}
public int getViewHeight() {
return viewHeight;
}
// START END X Y
public double getStartX() {
return startX;
}
public double getEndX() {
return endX;
}
public double getStartY() {
return startY;
}
public double getEndY() {
return endY;
}
// SET BALL TEXT
public void addTextToBall(String text) {
if(balID != "")
HashBall.get(balID).setText(text);
}
// PATH
public String getImagePath() {
return imagePath;
}
// THE ORIGINAL INSAMPELSIZE=4 BITMAP
public Bitmap getBitmap() {
return bitmap;
}
// STOP DRAWAING THE BALL
public void removeBall(boolean value) {
removeBall = value;
}
// THE RECT THAT RETURN WRONG VALUE
public Rect getRect(){

Rect r = getDrawable().copyBounds();

int drawLeft = r.left;
int drawTop = r.top;
int drawRight = r.right;
int drawBottom = r.bottom;
return r;
}

@Override
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld){
super.onSizeChanged(xNew, yNew, xOld, yOld);
viewWidth = xNew;
viewHeight = yNew;
}

public void addBall(){

// HERE I TRY TO CALCULATE THE BOUNDS LEFT,RIGHT,TOP AND BOTTOM EDGE OF THE BITMAP
//NOT GOING THAT GOOD
if(HashBall == null)
HashBall = new HashMap<String,ColorBall2>();

//X
double drawAbleWidth = viewWidth/ratio;
startX = (viewWidth-drawAbleWidth)/2;

double drawAbleHight = viewHeight/ratio;
startY = drawAbleHight/2;

int ballY = (viewHeight/2);
int ballX = (viewWidth/2);

Point point1 = new Point();
point1.x = (int) ballX;
point1.y = (int) ballY;
String uuId = UUID.randomUUID().toString();
HashBall.put(uuId,(new ColorBall2(ctx,R.drawable.pen1, point1,uuId)));


}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);


//canvas.drawCircle(10,10,10,null);
if(!removeBall && HashBall != null){
for (String key : HashBall.keySet()) {
//System.out.println("Key: " + key + ", Value: " + map.get(key));
if(addtext!=null)
//canvas.drawCircle(HashBall.get(key).getX(), HashBall.get(key).getY(), 10, paint2);
canvas.drawBitmap(HashBall.get(key).getBitmap(), HashBall.get(key).getX()-10, HashBall.get(key).getY()-80, null);
canvas.drawText (HashBall.get(key).getText() + " X="+HashBall.get(key).getX() + " Y="+HashBall.get(key).getY()
, HashBall.get(key).getX(), HashBall.get(key).getY(), paint);
}

}

}


// events when touching the screen
@Override
public boolean onTouchEvent(MotionEvent event) {
int eventaction = event.getAction();


int X = (int)event.getX();
int Y = (int)event.getY();

switch (eventaction )
{

case MotionEvent.ACTION_DOWN: // touch down so check if the finger is on a ball
balID = "";
for (String key : HashBall.keySet()) {

// check if inside the bounds of the ball (circle)
// get the center for the ball
int centerX = HashBall.get(key).getX() + 15;
int centerY = HashBall.get(key).getY() + 15;

// calculate the radius from the touch to the center of the ball
double radCircle = Math.sqrt( (((centerX-X)*(centerX-X)) + (centerY-Y)*(centerY-Y)));

// if the radius is smaller then 23 (radius of a ball is 22), then it must be on the ball
if (radCircle < 33){
balID = HashBall.get(key).getID();
addtext.setText(HashBall.get(key).getText());
break;
}
}

break;


case MotionEvent.ACTION_MOVE: // touch drag with the ball
// move the balls the same as the finger
if (balID != "") {
HashBall.get(balID).setX(X-25);
HashBall.get(balID).setY(Y-25);

}
break;

case MotionEvent.ACTION_UP:
// touch drop - just do things here after dropping

break;
}
// redraw the canvas
invalidate();
return true;
}
}

最佳答案

这是我想分享的一个方法,它将使用getImageMatrix返回imageView中位图的偏移量

public static int[] getBitmapOffset(ImageView img,  Boolean includeLayout) {
int[] offset = new int[2];
float[] values = new float[9];

Matrix m = img.getImageMatrix();
m.getValues(values);

offset[0] = (int) values[Matrix.MTRANS_Y];
offset[1] = (int) values[Matrix.MTRANS_X];

if (includeLayout) {
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) img.getLayoutParams();
int paddingTop = (int) (img.getPaddingTop() );
int paddingLeft = (int) (img.getPaddingLeft() );

offset[0] += paddingTop + lp.topMargin;
offset[1] += paddingLeft + lp.leftMargin;
}
return offset;
}

关于android - 如何在imageview中获取图像边缘x/y位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6023549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com