我想要实现的是在与图像中已存在的黑点完全相同的位置绘制点,但是我必须面对图像的问题:
现在关于点画的问题:
我已将所有图片移至drawable
文件夹并完成layout_width = wrap_content
,高度与宽度相同。
<com.jutt.dotbot.ConnectDotsView
android:id="@+id/gfxImage"
android:layout_width="500dpi"
android:layout_height="600dpi"
android:layout_marginTop="100dip"
android:layout_centerHorizontal="true"/>
我通过在ACTION_DOWN
中的每个onTouchEvent
上点上点来查看硬编码点,然后记下并提供给班级ConnectDotsView。
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate();
L.s(getContext(), "x = "+x+"y = "+y);
break;
在我注意到所有得出的分数之后,我通过致电给这个课程提供相同的要点:
public void setPoints(List<Point> points) {
this.mPoints = points;
}
现在最大的问题[我认为仍然存在],屏幕1152w * 720h上的(x,y)在480w * 600h上可能不一样,所以我所做的是实际的功能是谁转换这些点。
private static final int OLDSCREENX = 1152;
private static final int OLDSCREENY = 720;
private int[] makeDimentionGeneric(float oldScreenX, float oldScreenY,
float oldX, float oldY) {
// get screen size
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
final float y = displaymetrics.heightPixels;
final float x = displaymetrics.widthPixels;
int[] i = new int[] { (int) ((oldX / oldScreenX) * x),
(int) ((oldY / oldScreenY) * y) };
return i;
}
我正在设置makeDimentionGeneric(OLDSCREENX, OLDSCREENY, p.x, p.y);
之类的点,而p.x and p.y
是来自屏幕的硬编码存储值。
现在当我尝试在不同设备上运行时会发生什么。
我什么时候做错了,我怎样才能正确实现?拜托,我努力学习,但似乎找不到比我提到的更好的方法。
private int[] makeDimentionGeneric(float oldScreenX, float oldScreenY,
float oldX, float oldY) {
// convert all px to dp
oldScreenY = convertPixelsToDp(oldScreenY, this);
oldScreenX = convertPixelsToDp(oldScreenX,this);
oldX = convertPixelsToDp(oldX,this);
oldY = convertPixelsToDp(oldY,this);
// get screen size
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
final float y = convertPixelsToDp(displaymetrics.heightPixels, this);
final float x = convertPixelsToDp(displaymetrics.widthPixels, this);
int[] i = new int[] { (int)((oldX / oldScreenX) * x),
(int) ((oldY / oldScreenY) * y) };
return i;
}
答案 0 :(得分:1)
由于您的图像因DPI而异,因此您的像素计算也必须根据DPI而有所不同。请考虑以下问题:
在您的情况下(从上述问题的答案中复制)您可能想要使用此方法:
/**
* This method converts device specific pixels to density independent pixels.
*
* @param px A value in px (pixels) unit. Which we need to convert into db
* @param context Context to get resources and device specific display metrics
* @return A float value to represent dp equivalent to px value
*/
public static float convertPixelsToDp(float px, Context context){
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
float dp = px / (metrics.densityDpi / 160f);
return dp;
}