Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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 – 如何在不同屏幕分辨率的视图上重新定位点?全部内容,希望文章能够帮你解决android – 如何在不同屏幕分辨率的视图上重新定位点?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。