Android 以与用户手指在布局上移动相同的速度更改相对布局的高度

Android 以与用户手指在布局上移动相同的速度更改相对布局的高度,android,android-layout,listview,drag,ontouchlistener,Android,Android Layout,Listview,Drag,Ontouchlistener,我是开发新手,我正在创建一个应用程序,其中我有一个相对布局,在该相对布局下有一个列表视图。现在的问题是,当用户移动listview时,当此RelativeLayout达到其最小阈值,即140dp RelativeLayout高度应停止降低,listview应以正常速度移动时,我必须将此相对布局(蓝色背景)的高度从300dp动态更改为140dp 下面是图片,请提前感谢 ` package com.example.testmovinglayout; 导入java.util.ArrayList;

我是开发新手,我正在创建一个应用程序,其中我有一个相对布局,在该相对布局下有一个列表视图。现在的问题是,当用户移动listview时,当此RelativeLayout达到其最小阈值,即140dp RelativeLayout高度应停止降低,listview应以正常速度移动时,我必须将此相对布局(蓝色背景)的高度从300dp动态更改为140dp

下面是图片,请提前感谢

`

package com.example.testmovinglayout;
导入java.util.ArrayList;
导入java.util.array;
导入android.app.Activity;
导入android.graphics.Matrix;
导入android.graphics.PointF;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.Menu;
导入android.view.MotionEvent;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.LinearLayout;
导入android.widget.ListView;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
公共类MainActivity扩展活动实现View.OnTouchListener{
矩阵=新矩阵();
矩阵savedMatrix=新矩阵();
静态最终int NONE=0;
静态最终整数阻力=1;
静态最终整数缩放=2;
int模式=无;
私有浮动[]矩阵值=新浮动[9];
float matrixX=0;//ImageView中矩阵的X坐标
float matrixY=0;//ImageView中矩阵的Y坐标
浮动宽度=0;//可拉伸的宽度
浮动高度=0;//可拉伸的高度
私有浮点dx;//后平移X距离
私有浮点dy;//后平移Y距离
PointF start=新的PointF();
PointF mid=新的PointF();
浮动oldDist=1f;
内部高度_120dp;
内部高度_230dp;
私有ListView主ListView;
专用阵列适配器列表适配器;
线性布局超高;
线性布局父对象;
相对疲劳试验;
文本视图_视图;
//视图组_根;
私人国际电信公司;
私人国际酒店;
私人住宅;
//为ImageView标签创建字符串
私有静态最终字符串IMAGEVIEW_TAG=“图标位图”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最终浮动比例=getResources().getDisplayMetrics().density;
高度_120dp=(int)(120*刻度+0.5f);
高度_230dp=(内部)(230*刻度+0.5f);
rlTest=(RelativeLayout)findViewById(R.id.rlTest);
parent_LLID=(LinearLayout)findviewbyd(R.id.parent_LLID);
superLL=(LinearLayout)findviewbyd(R.id.superLL);
//查找ListView资源。
mainListView=(ListView)findViewById(R.id.mainListView);
//创建并填充行星名称列表。
字符串[]行星=新字符串[]{“水星”、“金星”、“地球”、“火星”,
“木星”、“土星”、“天王星”、“海王星”};
ArrayList planetList=新的ArrayList();
planetList.addAll(Arrays.asList(planets));
//使用行星列表创建ArrayAdapter。
listAdapter=new ArrayAdapter(此,R.layout.simplerow,
行星学家);
//添加更多行星。如果传递的是字符串[]而不是列表
//在ArrayAdapter构造函数中,不能添加更多项。
//否则将发生异常。
添加(“Ceres”);
添加(“Pluto”);
添加(“Haumea”);
添加(“Makemake”);
添加(“Eris”);
//将ArrayAdapter设置为ListView的适配器。
mainListView.setAdapter(listAdapter);
//_root=(视图组)findViewById(R.id.root);
_视图=新文本视图(此);
_view.setText(“TextView!!!!!!!”);
LinearLayout.LayoutParams LayoutParams=新的LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_父级,
LinearLayout.LayoutParams.WRAP_内容);
layoutParams.leftMargin=0;
layoutParams.topMargin=0;
layoutParams.bottomMargin=0;
layoutParams.rightMargin=0;
mainListView.setLayoutParams(layoutParams);
mainListView.setOnTouchListener(这个);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共布尔onTouch(视图v,运动事件){
final int X=(int)event.getRawX();
int Y=(int)event.getRawY();
Log.v(“Y为:”,“+Y”);
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION\u DOWN:
LinearLayout.LayoutParams lParams=(LinearLayout.LayoutParams)superLL
.getLayoutParams();
_xDelta=X-lParams.leftMargin;
_yDelta=Y-lParams.topMargin;
Log.v(“event.getX()是:”,“+event.getX());
Log.v(“event.getY()是:”,“+event.getY());
savedMatrix.set(矩阵);
set(event.getX(),event.getY());
模式=拖动;
Log.v(“\u yDelta为:”,“+\u yDelta);
打破
case MotionEvent.ACTION\u UP:
Log.v(“event.getX()是:”,“+event.getX());
Log.v(“event.getY()是:”,“+event.getY());
savedMatrix.set(矩阵);
set(event.getX(),height_120dp);
模式=拖动;
打破
case MotionEvent.ACTION\u指针\u向下:
打破
case MotionEvent.ACTION\u指针\u向上:
打破
case MotionEvent.ACTION\u移动:
LinearLayout.LayoutParams LayoutParams=(LinearLayout.LayoutParams)superLL
.getLayoutParams();
//layoutParams.leftMargin=X-xDelta;
layoutParams.topMargin=Y-_yDelta;
//layoutParams.rightMargin=20;
//layoutParams.bottomMargin=-250;
superLL.setLayoutParams(layoutParams);
打破
}
父对象ID.invalidate();
返回true;
}
}    
` 
`     

`而不是使用手势或动作
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>