IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> test2 -> 正文阅读

[移动开发]test2

package com.example.testjni.livetext;

import android.app.Activity;
import android.graphics.RectF;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.DragEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.OverScroller;

import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;

import com.example.testjni.R;
import com.github.chrisbanes.photoview.OnMatrixChangedListener;
import com.github.chrisbanes.photoview.OnScaleChangedListener;
import com.github.chrisbanes.photoview.OnSingleFlingListener;
import com.github.chrisbanes.photoview.OnViewDragListener;
import com.github.chrisbanes.photoview.PhotoView;

/**
 * create by zlk
 * on 2022/5/3
 */
public class TestLiveTextActivity extends Activity {

    PhotoView view;
    TestManView testManView;
    private String TAG = "TestLiveTextActivity";
    float scale = 1;
    float offsetX = 0;
    float offsetY = 0;
    OverScroller overScroller;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_live);
        view = findViewById(R.id.photo_view);
        testManView = findViewById(R.id.test_man_view);
        // 这两个参数不懂
        view.setImageResource(R.mipmap.shu);
        Log.e(TAG,"oncreate");

        overScroller = new OverScroller(this);
        view.setOnMatrixChangeListener(new MatrixChangeListener());

// 以某个点为中心扩大和缩小和平移动
        //获取图片的宽和高
        view.setOnScaleChangeListener(new OnScaleChangedListener() {
            @Override
            public void onScaleChange(float scaleFactor, float focusX, float focusY) {
//                Log.e(TAG,"focusX = " + focusX + " focusY = "+focusY +
//                        "scaleFactor = " + scaleFactor);
                scale = scale * scaleFactor;
                // 控制原点
                testManView.setPivotX(focusX);
                testManView.setPivotY(focusY);
                testManView.setScaleX(scale);
                testManView.setScaleY(scale);

            }
        });
        view.setOnSingleFlingListener(new OnSingleFlingListener() {
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                Log.d(TAG,"velocityX  = " + velocityX);
                Log.d(TAG,"velocityY  = " + velocityY);

                if(scale != 1) {
                    overScroller.fling((int) offsetX, (int) offsetY, (int) velocityX, (int) velocityY,
                            -(int) (view.getWidth() * scale - view.getWidth()) / 2,
                            (int) (view.getWidth() * scale - view.getWidth()) / 2,
                            -(int) (view.getHeight() * scale - view.getHeight()) / 2,
                            (int) (view.getHeight() * scale - view.getHeight()) / 2,
                            300, 300);
                    //postOnAnimation(new FlingRunner());
                    //view.postDelayed(new FlingRunner(), 1000 / 60);
                }
//                overScroller.computeScrollOffset();
//                offsetX = overScroller.getCurrX();
//                offsetY = overScroller.getCurrY();
                return false;
            }
        });
        //错误原因,没考虑边界,下滑可能滑动的距离很大。。操他妈
        view.setOnViewDragListener(new OnViewDragListener() {
            @Override
            public void onDrag(float dx, float dy) {
                Log.d(TAG,"dx  = " + dx + " dy = " +dy);
               // Log.e(TAG, "first retf =" + firstRectf.toString());
                if(scale!=1) {
                    Log.e(TAG, "current retf =" + currentRectf.toString());
                    Log.e(TAG, "isChangex =" +isChangex);
                    Log.e(TAG, "isChangey =" +isChangey);
                    if(isChangex){
                        offsetX += dx;
                        testManView.setTranslationX(offsetX );
                    }
                    if(isChangey){
                        offsetY += dy;
                        testManView.setTranslationY(offsetY );
                    }

//                    offsetY += dy;
//                    fixOffsets();
                    Log.d(TAG,"offsetX  = " + offsetX + " offsetY = " +offsetY);
                  //  Log.d(TAG,"scale  = " + scale);




                }
            }
        });

//
//        view.setOnScrollChangeListener(new View.OnScrollChangeListener() {
//            @Override
//            public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
//                Log.d(TAG,"scrollX  = " + scrollX);
//                Log.d(TAG,"scrollY  = " + scrollY);
//            }
//        });

    }

    class FlingRunner implements Runnable {

        @Override
        public void run() {
            if (overScroller.computeScrollOffset()) {
                offsetX = overScroller.getCurrX();
                offsetY = overScroller.getCurrY();
                testManView.setTranslationX(offsetX * scale);
                testManView.setTranslationY(offsetY * scale);
                // 下一帧动画的时候执行
                view.postDelayed(this, 1000/60);
            }
        }
    }

    // 计算边界,区间算错了算大了
    private void fixOffsets() {
//        offsetX = Math.min(offsetX,  currentRectf.left - firstRectf.left);
//        offsetX = Math.max(offsetX, currentRectf.right - firstRectf.right );
//        offsetY = Math.min(offsetY, currentRectf.top - firstRectf.top );
//        offsetY = Math.max(offsetY,currentRectf.bottom - firstRectf.bottom );
//
//        Log.e(TAG,"left = "+  (currentRectf.left - firstRectf.left));

        if(currentRectf.left == 0){

        }
    }
    RectF firstRectf,currentRectf = new RectF(1,1,1,1);
    boolean isChangex,isChangey;

    //构建一个最大的可移动juxing
    private class MatrixChangeListener implements OnMatrixChangedListener {

        @Override
        public void onMatrixChanged(RectF rect) {
            if(currentRectf ==  null){
                currentRectf = rect;
            }else{

//                if(rect.left <firstRectf.left){
//                    firstRectf.left = rect.left;
//                }
//                if(rect.right >firstRectf.right){
//                    firstRectf.right = rect.right;
//                }
//                if(rect.top <firstRectf.top){
//                    firstRectf.top = rect.top;
//                }
//                if(rect.bottom >firstRectf.bottom){
//                    firstRectf.bottom = rect.bottom;
//                }
                //currentRectf.top != rect.top || currentRectf.bottom != rect.bottom
                isChangex = false;
                isChangey = false;
                if( currentRectf.left != rect.left && currentRectf.right != rect.right) {
                    currentRectf.left = rect.left;
                    currentRectf.right = rect.right;
                    isChangex =  true;
                }

                if(currentRectf.top != rect.top && currentRectf.bottom != rect.bottom) {
                    currentRectf.top = rect.top;
                    currentRectf.bottom = rect.bottom;
                    isChangey = true;
                }
            }
        }
    }

}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:18:35  更:2022-05-07 11:19:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 0:46:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码