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

4
我是开发新手,正在创建一个应用程序,在其中我有一个相对布局和一个下面的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>

`


是的,我必须将相对布局移动到蓝色背景中可见的顶部,我正在使用onTouchListener来实现,但现在出现的问题是当我移动它时,它的浮动阈值没有被设置。 - Aayushi
如果您将您的布局以XML方式发布,那会更容易些。 - Damian Petla
@Aayushi,你可以把你的代码放在这里吗? - Pratik Dasa
会需要一些时间,我会发布它。 - Aayushi
让我们在聊天中继续这个讨论 - Pratik Dasa
显示剩余4条评论
1个回答

1
最好使用带有标题的ListView,而不是手势或动作事件,这样应该可以很好地工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接