我是开发新手,正在创建一个应用程序,在其中我有一个相对布局和一个下面的ListView。现在问题是,当用户移动ListView时,我必须动态将此相对布局(蓝色背景中的)的高度从300dp更改为140dp,当此RelativeLayout达到其最小阈值即140dp RelativeLayout高度应停止减少,并且ListView应以正常速度移动。
以下是图片,谢谢提前帮助。
以下是图片,谢谢提前帮助。
package com.example.testmovinglayout;
import java.util.ArrayList;
import java.util.Arrays;
import android.app.Activity;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MainActivity extends Activity implements View.OnTouchListener {
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
private float[] matrixValues = new float[9];
float matrixX = 0; // X coordinate of matrix inside the ImageView
float matrixY = 0; // Y coordinate of matrix inside the ImageView
float width = 0; // width of drawable
float height = 0; // height of drawable
private float dx; // postTranslate X distance
private float dy; // postTranslate Y distance
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
int height_120dp;
int height_230dp;
private ListView mainListView;
private ArrayAdapter<String> listAdapter;
LinearLayout superLL;
LinearLayout parent_LLID;
RelativeLayout rlTest;
TextView _view;
// ViewGroup _root;
private int _xDelta;
private int _yDelta;
private int YThreshold;
// Create a string for the ImageView label
private static final String IMAGEVIEW_TAG = "icon bitmap";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final float scale = getResources().getDisplayMetrics().density;
height_120dp = (int) (120 * scale + 0.5f);
height_230dp = (int) (230 * scale + 0.5f);
rlTest = (RelativeLayout) findViewById(R.id.rlTest);
parent_LLID = (LinearLayout) findViewById(R.id.parent_LLID);
superLL = (LinearLayout) findViewById(R.id.superLL);
// Find the ListView resource.
mainListView = (ListView) findViewById(R.id.mainListView);
// Create and populate a List of planet names.
String[] planets = new String[] { "Mercury", "Venus", "Earth", "Mars",
"Jupiter", "Saturn", "Uranus", "Neptune" };
ArrayList<String> planetList = new ArrayList<String>();
planetList.addAll(Arrays.asList(planets));
// Create ArrayAdapter using the planet list.
listAdapter = new ArrayAdapter<String>(this, R.layout.simplerow,
planetList);
// Add more planets. If you passed a String[] instead of a List<String>
// into the ArrayAdapter constructor, you must not add more items.
// Otherwise an exception will occur.
listAdapter.add("Ceres");
listAdapter.add("Pluto");
listAdapter.add("Haumea");
listAdapter.add("Makemake");
listAdapter.add("Eris");
// Set the ArrayAdapter as the ListView's adapter.
mainListView.setAdapter(listAdapter);
// _root = (ViewGroup)findViewById(R.id.root);
_view = new TextView(this);
_view.setText("TextView!!!!!!!!");
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.leftMargin = 0;
layoutParams.topMargin = 0;
layoutParams.bottomMargin = 0;
layoutParams.rightMargin = 0;
mainListView.setLayoutParams(layoutParams);
mainListView.setOnTouchListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
final int X = (int) event.getRawX();
int Y = (int) event.getRawY();
Log.v("Y is : ", "" + Y);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
LinearLayout.LayoutParams lParams = (LinearLayout.LayoutParams) superLL
.getLayoutParams();
_xDelta = X - lParams.leftMargin;
_yDelta = Y - lParams.topMargin;
Log.v("event.getX() is : ", "" + event.getX());
Log.v("event.getY() is : ", "" + event.getY());
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
mode = DRAG;
Log.v("_yDelta is : ", "" + _yDelta);
break;
case MotionEvent.ACTION_UP:
Log.v("event.getX() is : ", "" + event.getX());
Log.v("event.getY() is : ", "" + event.getY());
savedMatrix.set(matrix);
start.set(event.getX(), height_120dp);
mode = DRAG;
break;
case MotionEvent.ACTION_POINTER_DOWN:
break;
case MotionEvent.ACTION_POINTER_UP:
break;
case MotionEvent.ACTION_MOVE:
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) superLL
.getLayoutParams();
// layoutParams.leftMargin = X - _xDelta;
layoutParams.topMargin = Y - _yDelta;
// layoutParams.rightMargin = 20;
// layoutParams.bottomMargin = -250;
superLL.setLayoutParams(layoutParams);
break;
}
parent_LLID.invalidate();
return true;
}
}
`
`
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/parent_LLID"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<LinearLayout
android:id="@+id/superLL"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/rlTest"
android:layout_width="match_parent"
android:layout_height="230dp"
android:background="#aafff7"
>
</RelativeLayout>
<ListView
android:id="@+id/mainListView"
android:background="#ffffff"
android:layout_below="@+id/rlTest"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
</LinearLayout>
</LinearLayout>
`