Câu hỏi Thay đổi kích thước mịn biểu đồ và chế độ xem bản đồ


Tôi có một biểu đồ hình tròn và chế độ xem bản đồ trên màn hình. Giữa biểu đồ và chế độ xem bản đồ, có một số lần xem nhỏ. Khi di chuyển hình ảnh, biểu đồ và chế độ xem bản đồ được cho là sẽ tăng và thu nhỏ. Nó hoạt động, nhưng khi tôi di chuyển imageview, ứng dụng đang run rẩy. Tôi muốn kích thước của họ thay đổi một cách trôi chảy. Tôi nghĩ đó là do biểu đồ hình tròn. Làm thế nào tôi có thể sửa lỗi này? Cảm ơn. Đây là mã Java của tôi:

final LinearLayout aboveLinear = (LinearLayout) findViewById(R.id.aboveLinear);
        final LinearLayout belowLinear = (LinearLayout) findViewById(R.id.belowLinear);

        final ImageView imageView2 = (ImageView) findViewById(R.id.imageView2);


        detector = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener() {

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                if ( aboveLinear == null || belowLinear == null ) {
                    return true;
                }
                distanceY*=-1;
                int height = aboveLinear.getHeight ( ) + mapview.getHeight ( );
                ViewGroup.LayoutParams layoutParams = aboveLinear.getLayoutParams ( );
                if ( ( int ) distanceY + layoutParams.height < minH )
                    layoutParams.height = minH;
                else if ( ( int ) distanceY + layoutParams.height > height - minH )
                    layoutParams.height = height - minH;
                else
                    layoutParams.height = ( int ) distanceY + layoutParams.height;

                ViewGroup.LayoutParams layoutParams2 = belowLinear.getLayoutParams ( );
                layoutParams2.height = height - layoutParams.height;

                aboveLinear.setLayoutParams ( layoutParams );
                belowLinear.setLayoutParams ( layoutParams2 );

                return true;
            }
        });

        imageView2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(final View view, final MotionEvent motionEvent) {
                return detector.onTouchEvent(motionEvent);
            }
        });


        mapview = (MapView) findViewById(R.id.mapview);
        mapview.onCreate(savedInstanceState);

        chart1 = (PieChart) findViewById(R.id.chart1);
        chart1.setUsePercentValues(true);
        chart1.setDescription("");
        chart1.setExtraOffsets(5, 10, 5, 5);

        chart1.setDragDecelerationFrictionCoef(0.95f);

Đây là mã xml của tôi:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    xmlns:mapbox="http://schemas.android.com/apk/res-auto"
    android:id="@+id/root">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/aboveLinear">

        <com.github.mikephil.charting.charts.PieChart
            android:id="@+id/chart1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentTop="true"
            android:scaleType="fitXY"/>

   </LinearLayout>

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="match_parent"
        android:layout_height="25dp"
        android:layout_alignParentTop="true"
        android:clickable="true"
        android:scaleType="fitXY"
        android:src="@drawable/red"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:id="@+id/belowLinear">

        <com.mapbox.mapboxsdk.maps.MapView
            android:layout_height="match_parent"
            android:scaleType="fitXY"
            android:id="@+id/mapview"
            android:layout_width="fill_parent"
            mapbox:access_token="@string/accessToken"
            mapbox:style_url="@string/style_mapbox_streets"
            mapbox:center_latitude="41.885"
            mapbox:center_longitude="-87.679"
            mapbox:zoom="12"
            mapbox:tilt="20"/>
    </LinearLayout>

   </LinearLayout>

8
2018-06-20 07:10


gốc


Bạn đã bao giờ thử ValueAnimator ...? Nó cho phép bạn thay đổi các thuộc tính của View mượt mà .... - Moinkhan


Các câu trả lời:


Bạn không cần hoạt hình để làm điều này. Không tính toán height mỗi lần. Giải pháp này sẽ giúp bạn

 private MapView mapview;
PieChart chart1;
GestureDetectorCompat detector;
int minH = 100;
int height = 0;
private LinearLayout aboveLinear;
private LinearLayout belowLinear;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mappie);

    aboveLinear = (LinearLayout) findViewById(R.id.aboveLinear);
    belowLinear = (LinearLayout) findViewById(R.id.belowLinear);

    final ImageView imageView2 = (ImageView) findViewById(R.id.imageView2);


    detector = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener() {

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            if ( aboveLinear == null || belowLinear == null ) {
                return true;
            }
            if(distanceY > 90){
                distanceY = 90;
            }
            else if(distanceY < -90){
                distanceY = -90;
            }
            distanceY*=-1;
            if(height == 0){
                height = aboveLinear.getMeasuredHeight()+belowLinear.getMeasuredHeight();// calculate only once
            }
            Log.wtf("Mapie","Height :"+height);
            int toHeightAL, toHeightBl;
            ViewGroup.LayoutParams layoutParams = aboveLinear.getLayoutParams ( );

            if(layoutParams.height == 0){
                layoutParams.height = height/2; // params.height returns 0 before setting the value for it
            }

            if ( ( int ) distanceY + layoutParams.height < minH )
                toHeightAL = minH;
            else if ( ( int ) distanceY + layoutParams.height > height - minH )
                toHeightAL = height - minH ;
            else
                toHeightAL = ( int ) distanceY + layoutParams.height;

            ViewGroup.LayoutParams layoutParams2 = belowLinear.getLayoutParams ();
            toHeightBl = height - layoutParams.height;

            layoutParams.height = toHeightAL;
            layoutParams2.height = toHeightBl;
            aboveLinear.setLayoutParams ( layoutParams );
            belowLinear.setLayoutParams ( layoutParams2 );

            return true;
        }
    });

    imageView2.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(final View view, final MotionEvent motionEvent) {

            return detector.onTouchEvent(motionEvent);
        }
    });


    mapview = (MapView) findViewById(R.id.mapview);
    mapview.onCreate(savedInstanceState);

    chart1 = (PieChart) findViewById(R.id.chart1);
    chart1.setUsePercentValues(true);
    chart1.setDescription("");
    chart1.setExtraOffsets(5, 10, 5, 5);

    chart1.setDragDecelerationFrictionCoef(0.95f);
}

5
2018-06-28 13:16





Bạn có thể thử sử dụng hoạt ảnh để thay đổi kích thước chế độ xem này. Thay vào đó để đặt chiều cao và chiều rộng bằng với một giá trị, có thể bạn phải tạo hiệu ứng động từ chiều cao / chiều rộng bắt đầu đến chiều cao / chiều rộng bạn muốn sử dụng.

Kiểm tra tại đây https://stackoverflow.com/a/8162779/6093353. Người dùng này đã viết một hoạt ảnh tùy chỉnh rất đơn giản để thay đổi kích thước chế độ xem nhưng bạn có thể viết hoạt ảnh bạn muốn của riêng mình.

Hãy cho tôi biết nếu điều này giúp bạn!


4
2018-06-28 06:55



Cảm ơn, tôi thích sử dụng cử chỉ thay vì hoạt ảnh. Bởi vì chúng thực tế hơn. - jason
được! Vì vậy, có thể bạn có thể thử vẽ chế độ xem của mình trên canvas và sau đó bạn có thể sử dụng phương thức scale () của lớp Canvas để thay đổi kích thước của nó trong cử chỉ của bạn. Ở đây có một ví dụ developer.android.com/training/gestures/scale.html - Erik Minarini


Hãy thử thay thế các chức năng OnScroll với điều này (tôi đã không cố gắng này, cũng không gõ nó trong một IDE java vì vậy có lẽ tôi không truy cập vào các thuộc tính đúng cách như tôi đang sử dụng nhiều hơn để C #):

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
    {
        if (aboveLinear == null || belowLinear == null)
        {
            return true;
        }
        int currentY = e1.getY();
        float ratio = abovelinear.getHeight() / (aboveLinear.Bottom - currentY);
        aboveLinear.SetScaleY( aboveLinear.GetScaleY()- ratio);
        belowLinear.SetScaleY(belowLinear.GetScaleY() +ratio); 

        return true;
    }
});

Điều này sẽ chỉ hoạt động theo một cách (từ trên xuống), nhưng với một thời gian bạn sẽ có thể có được những gì bạn đang tìm kiếm.


3
2018-06-28 09:10



Tôi lấy mã từ một nơi nào đó, nó đã làm việc với các lần xem hình ảnh nhưng không hoạt động với mapview và biểu đồ. Vì vậy, tôi không biết nhiều mã. - jason
Bạn có thể thêm hình ảnh về những gì sẽ xảy ra và những gì bạn muốn xảy ra không? Thật khó để tôi hiểu những gì bạn muốn đạt được. Từ những gì tôi hiểu bạn muốn mở rộng lên và xuống biểu đồ của bạn và xem bản đồ của bạn khi bạn xem hình ảnh "di chuyển". Đó là phần tôi không nhận được. ImageView của bạn phải di chuyển như thế nào? Lên và xuống ? Bên trái và bên phải ? Trong bât ki chỉ dân nao ? Tại sao bạn muốn thay đổi kích thước Biểu đồ và bản đồ thay vì chỉ đẩy chúng ra khỏi màn hình? - yan yankelevich
Được rồi tôi nghĩ rằng tôi đã nhận nó! Nếu tôi hiểu đúng, bạn muốn kéo lên và xuống đường màu đỏ của mình và cách này làm cho Biểu đồ hoặc Mapview của bạn lấp đầy khoảng trống phía dưới và phía trên dòng này tùy thuộc vào vị trí của nó. Tôi có đúng không? - yan yankelevich
Đúng, nếu bạn kéo biểu đồ trở nên nhỏ hơn và bản đồ sẽ lớn hơn ở cùng tốc độ. - jason
Tôi không đảm bảo cho bạn mã tôi vừa thêm vào sẽ hoạt động, tôi không có cách nào để kiểm tra nó ngay bây giờ, nó không quản lý thông số chiều cao tối thiểu và tối đa của bạn, có thể nó sẽ không hoạt động chút nào, tôi không biết ^ ^ - yan yankelevich