Android 获取屏幕的中心线并根据它对齐视图
我必须以编程方式将ImageView添加到RelativeLayout中,使其位于中心右侧100dp。我这样做是为了一个特定的屏幕大小和分辨率,但我希望它能在任何大小的手机和desnity上工作。我为此所做的尝试如下: 代码:Android 获取屏幕的中心线并根据它对齐视图,android,android-layout,screen-resolution,aspect-ratio,android-windowmanager,Android,Android Layout,Screen Resolution,Aspect Ratio,Android Windowmanager,我必须以编程方式将ImageView添加到RelativeLayout中,使其位于中心右侧100dp。我这样做是为了一个特定的屏幕大小和分辨率,但我希望它能在任何大小的手机和desnity上工作。我为此所做的尝试如下: 代码: float xCord, yCord; float xCenter, yCenter; float radius; float angle; double x, y; TextView tv; RelativeLa
float xCord, yCord;
float xCenter, yCenter;
float radius;
float angle;
double x, y;
TextView tv;
RelativeLayout container;
ImageView view;
RelativeLayout.LayoutParams viewParams;
DisplayMetrics metrics ;
float density;
int dps,pxs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_circular_animation);
metrics = getApplicationContext().getResources().getDisplayMetrics();
float width = metrics.widthPixels;
float height = metrics.heightPixels;
tv = (TextView)findViewById(R.id.tv);
container = (RelativeLayout)findViewById(R.id.container);
xCenter = convertToDP(width)/2;
yCenter = convertToDP(height)/2;
radius = 100;
angle = 0;
x = xCenter + radius * Math.cos(angle * Math.PI / 180);
y = yCenter + radius * Math.sin(angle * Math.PI / 180);
view = new ImageView(this);
viewParams = new RelativeLayout.LayoutParams(50,50);
viewParams.leftMargin = (int) x;
viewParams.topMargin = (int) y;
view.setLayoutParams(viewParams);
view.setImageResource(R.drawable.square);
container.addView(view);
tv.setText(String.valueOf(xCenter) + " " + String.valueOf(yCenter));
}
public int convertToDP(float px) {
density = getApplicationContext().getResources().getDisplayMetrics().density;
dps = (int) ((px/density) + 0.5f);
return dps;
}
}
我做的是,得到屏幕大小和密度,然后除以2得到中心线。一旦我有了跳线,我就用公式得到了0度圆周上的点,但我没有得到正确的点。任何帮助都会很好。试试这个:
public class sampleMediaPlayer extends Activity {
// Toast mToast;
// int i = 0;
// private boolean click;
// private Camera camera;
Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mainf);
}
@Override
protected void onResume() {
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout);
float r = DPtoPX(100);
float mScreenWidth = rl.getWidth() / 2; // DPtoPX(100);
float mScreenHeight = rl.getHeight() / 2;// DPtoPX(100);
for (int i = 0; i < 360; i = i + 30) {
addView(rl, (int) (mScreenWidth + r * Math.cos(i * Math.PI / 180F)),
(int) (mScreenHeight + (int) r * Math.sin(i * Math.PI / 180F)));
}
addView(rl, (int) mScreenWidth, (int) ((mScreenHeight)));
}
}, 50);
super.onResume();
}
void addView(ViewGroup rl, int x, int y) {
Log.i("NIMISH", x + " = " + y);
ImageView CenterImage = new ImageView(this);
RelativeLayout.LayoutParams viewParamsCenter = new RelativeLayout.LayoutParams(10, 10);
// viewParamsCenter.addRule(RelativeLayout.CENTER_IN_PARENT);
viewParamsCenter.leftMargin = x;
viewParamsCenter.topMargin = y;
CenterImage.setLayoutParams(viewParamsCenter);
CenterImage.setImageResource(R.drawable.ic_launcher);
rl.addView(CenterImage);
}
float DPtoPX(float dp) {
Resources r = getResources();
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics());
}
}
返回屏幕大小,包括标题栏和状态栏,但在打印图像时,它是相对于RelativeLayout的屏幕大小计算的。所以,若你们用高度“metrics.heightPixels”绘制图像,你们会发现图像在屏幕外。这种现象影响了真中心的计算
还有其他一些计算方法,但每种方法都要求在屏幕上绘制视图。因此,onResume()之后的任何调用(已使用处理程序)。正如您所看到的,当调用form onResume()时,计算标题栏高度的函数返回0
如果您想让用户输入X,Y坐标,您可以通过
float mScreenWidth = DPtoPX(100);
float mScreenHeight = DPtoPX(100);
这样做,它将参照相对布局绘制图像,以便您可以删除处理程序。您想将图像放置在圆圈上还是仅将图像放置在中心100dp?我想将图像放置在相对于其屏幕中心100dp或200dp的任何位置(用户输入)。就像用户输入是X:200和Y:400,半径:100,角度:50。然后,应通过x=xCenter+radius*Math.cos(角度*Math.PI/180)获得视图线;y=圆心+半径*数学正弦(角度*数学PI/180);这里的xCenter和yCenter是屏幕中心点的连线。如果你要求的话,这是一条圆形路径。
private float Correction() {
Rect rectgle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
int StatusBarHeight = rectgle.top;
int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int TitleBarHeight = contentViewTop - StatusBarHeight;
Log.i("NIMISH", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight);
return contentViewTop;
}
float mScreenWidth = DPtoPX(100);
float mScreenHeight = DPtoPX(100);