大佬教程收集整理的这篇文章主要介绍了android – 如何在不同屏幕分辨率的视图上重新定位点?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
细节:
我有一个x和y坐标数组.但问题是它不能根据不同的屏幕分辨率进行调整.
我想要的是:
这是我的代码:
public class FirstFragment extends Fragment implements Step { int[] y = {381,379,372,351,329,305,269,230,195,156,117,95,64,44,24,15,13,25,46,72,107,128,162,222,244,266,298,324,341,363,378,376,339,308,281,263,246,237,235,259,274,318,334,353,383,414,443,467,490,512,538,562,582,596,604,602,586,532,510,485,461,439,391,365,344,322,262,234,241,257,279,306,335,359,375,381}; int[] x = {93,109,130,157,181,207,253,297,336,380,406,413,415,405,381,358,326,296,272,261,301,368,397,423,487,508,540,587,613,639,658,666,659,647,629,607,583,559,527,496,444,425,313,292,284,304,332,360,395,421,418,403,382,276,229,164,136,105,79,53,31,18,19,35,58,93}; @Nullable @Override public View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceStatE) { return inflater.inflate(R.layout.first_fragment,container,falsE); } @Override public void onViewCreated(@R_801_3868@,@Nullable Bundle savedInstanceStatE) { super.onViewCreated(view,savedInstanceStatE); final ConnectDotsView connectDotsView = (ConnectDotsView) view.findViewById(R.id.connect_dots_view); connectDotsView.setOnCompleteListener(new ConnectDotsView.CompleteListener() { @Override public void onCompleteListener() { Toast.makeText(getActivity(),"Completed",Toast.LENGTH_SHORT).show(); Log.e("Done","true"); } }); connectDotsView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.onGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); connectDotsView.getLocalVisibleRect(rect); Log.e("Width",rect.width() + ""); Log.e("Height",rect.height() + ""); Log.e("left",rect.left + ""); Log.e("right",rect.right + ""); Log.e("top",rect.top + ""); Log.e("bottom",rect.bottom + ""); int scale = (int) getresources().getDisplaymetrics().density; List<Point> points = new ArrayList<>(); for (int i = 0,j = 0; i < x.length && j < y.length; i++,j++) { Point p = new Point(x[i] / scale + rect.left,Y[j] / scale + rect.top); points.add(p); } connectDotsView.setPoints(points); } }); } @Override public VerificationError verifyStep() { return null; } @Override public void onSELEcted() { } @Override public void onError(@NonNull VerificationError error) { } }
自定义视图类:
package com.sagar.quizdemo; import android.content.Context; import android.content.res.resources; import android.graphics.bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import android.util.AttributeSet; import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; import java.util.ArrayList; import java.util.List; /** * Displaying canvas with optional dots drawn on it. User can connect dots with * sTraight lines. First dot can be connected with second dot,second with third * etc. * * @author lecho */ public class ConnectDotsView extends View { private Bitmap mBitmap; private Canvas mCanvas; private Path mPath; private Paint mPaint; private static final int TOUCH_TOLERANCE_DP = 24; private static final int BACKGROUND = 0xFFDDDDDD; // Points to be connected. private List<Point> mPoints = new ArrayList<>(); privatE int mLastPoinTindex = 0; privatE int mTouchTolerance; private Boolean isPathStarted = false; CompleteListener completeListener; public ConnectDotsView(Context context) { super(context); mCanvas = new Canvas(); mPath = new Path(); initPaint(); } interface CompleteListener { void onCompleteListener(); } public void setOnCompleteListener(CompleteListener listener) { completeListener = listener; } public ConnectDotsView(Context context,AttributeSet attrs) { super(context,attrs); mCanvas = new Canvas(); mPath = new Path(); initPaint(); } public ConnectDotsView(Context context,AttributeSet attrs,int defStylE) { super(context,attrs,defStylE); mCanvas = new Canvas(); mPath = new Path(); initPaint(); } public void clear() { mBitmap = Bitmap.createBitmap(getWidth(),getHeight(),Bitmap.Config.ARGB_8888); mBitmap.eraseColor(BACKGROUND); mCanvas.setBitmap(mBitmap); invalidate(); } @Override protected void onSizeChanged(int width,int height,int oldWidth,int oldHeight) { super.onSizeChanged(width,height,oldWidth,oldHeight); clear(); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(BACKGROUND); canvas.drawBitmap(mBitmap,null); canvas.drawPath(mPath,mPaint); // TODO remove if you don't want points to be visible. for (Point point : mPoints) { canvas.drawPoint(point.x,point.y,mPaint); } } @Override public Boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touch_start(x,y); invalidate(); break; case MotionEvent.ACTION_MOVE: touch_move(x,y); invalidate(); break; case MotionEvent.ACTION_UP: touch_up(x,y); invalidate(); break; } return true; } private void touch_start(float x,float y) { if (checkPoint(x,y,mLastPoinTindeX)) { mPath.reset(); // User starts from given point so path can be drawn. isPathStarted = true; } else { // User starts move from point which does not belong to mPoints list isPathStarted = false; } } private void touch_move(float x,float y) { if (isPathStarted) { mPath.reset(); Point point = mPoints.get(mLastPoinTindeX); mPath.moveTo(point.x,point.y); if (checkPoint(x,mLastPoinTindex + 1)) { point = mPoints.get(mLastPoinTindex + 1); mPath.lineTo(point.x,point.y); mCanvas.drawPath(mPath,mPaint); mPath.reset(); ++mLastPoinTindex; } else { int positionIndex = mLastPoinTindex + 1; if (positionIndex >= mPoints.size()) { completelistener.onCompleteListener(); } else { mPath.lineTo(x,y); } } } } private void touch_up(float x,float y) { mPath.reset(); if (checkPoint(x,mLastPoinTindex + 1) && isPathStarted) { // Move finished at valid point so I draw whole line. // That's the start point of current line segment. Point point = mPoints.get(mLastPoinTindeX); mPath.moveTo(point.x,point.y); // and that's the end point. point = mPoints.get(mLastPoinTindex + 1); mPath.lineTo(point.x,point.y); mCanvas.drawPath(mPath,mPaint); mPath.reset(); // Increment point index. ++mLastPoinTindex; isPathStarted = false; } } /** * checks if user touch point with some tolerance */ private Boolean checkPoint(float x,float y,int poinTindeX) { if (poinTindex >= mPoints.size()) { // All dots already connected. return false; } Point point = mPoints.get(poinTindeX); if (x > (point.x - mTouchTolerancE) && x < (point.x + mTouchTolerancE)) { if (y > (point.y - mTouchTolerancE) && y < (point.y + mTouchTolerancE)) { return true; } } return false; } /** * Sets up paint attributes. */ private void initPaint() { mPaint = new Paint(); mPaint.setAntiAlias@R_801_6334@; mPaint.setDither@R_801_6334@; mPaint.setColor(Color.bLACK); mPaint.setStyle(Paint.Style.stroke); mPaint.setstrokeJoin(Paint.Join.ROUND); mPaint.setstrokeCap(Paint.Cap.ROUND); mPaint.setstrokeWidth(12); mTouchTolerance = dp2px(TOUCH_TOLERANCE_Dp); } /** * Converts dpi units to px * * @param dp * @return */ privatE int dp2px(int dp) { resources r = getContext().getresources(); float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dp,r.getDisplaymetrics()); return (int) px; } public void setPaint(Paint paint) { this.mPaint = paint; } public Bitmap getBitmap() { return mBitmap; } public List<Point> getPoints() { return mPoints; } public void setPoints(List<Point> points) { this.mPoints = points; } }
图片链接:
https://i.stack.imgur.com/n67mq.png
请帮我解决这个问题.
connectDotsView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.onGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect rect = new Rect(); // Fist find the min and max value for x axis int minX = x[0]; int maxX = x[0]; for (int i = 1; i <= x.length - 1; i++) { if (maxX < x[i]) { maxX = x[i]; } if (minX > x[i]) { minX = x[i]; } } // Find min and max vlaue for Y axis int minY = y[0]; int maxY = y[0]; for (int i = 1; i <= y.length - 1; i++) { if (maxY < Y[i]) { maxY = Y[i]; } if (minY > Y[i]) { minY = Y[i]; } } connectDotsView.getLocalVisibleRect(rect); Log.e("Width",rect.width() + ""); Log.e("Height",rect.height() + ""); Log.e("left",rect.left + ""); Log.e("right",rect.right + ""); Log.e("top",rect.top + ""); Log.e("bottom",rect.bottom + ""); // Find the scale factor based on the view you allocated in the screen float scaleX = ((float) ((float) rect.width() / (float) maxX)); float scaleY = ((float) ((float) rect.height() / (float) maxY)); final float scale; // Take the loWest scale factor if (scaleX > scaleY) { scale = scaleY; } else { scale = scaleX; } // find the left and top int left = (rect.width() - ((int) ((float) maxX * scalE)) - ((int) ((float) minX * scalE))) / 2; int top = (rect.height() - ((int) ((float) maxY * scalE)) - ((int) ((float) minY * scalE))) / 2; // base on the above calculation draw in a view List<Point> points = new ArrayList<>(); for (int i = 0,j++) { Point p = new Point(((int) ((float) x[i] * scalE)) + left,(int) ((float) Y[j] * scalE) + top); points.add(p); } connectDotsView.setPoints(points); } });
以上是大佬教程为你收集整理的android – 如何在不同屏幕分辨率的视图上重新定位点?全部内容,希望文章能够帮你解决android – 如何在不同屏幕分辨率的视图上重新定位点?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。