Android 在使用捏合缩放和临时图像调整文本大小时限制大小

ATE*_*TES 6 java android android-layout android-recyclerview

我的静态布局上有文本,布局是 Recyclerview 中的一个项目。Recyclerview 类的触摸事件使用 ScaleGestureDetector 控制对文本的双指缩放。缩放场景是,当用户动作移动 Recyclerview 的屏幕时,获取 Recyclerview 的屏幕截图并将图像显示在 Recyclerview 上,并且用户缩放到图像。当操作启动时,将来自缩放的新文本大小应用到项目。新的文字大小应与缩放到图像时显示的文字大小相同。为此,我使用 RelativeSizeSpan 和浮点缩放器值。我想限制更改的总文本大小,但它不会发生。

在此处输入图片说明

真正的问题是,捏合缩放可以进行多次,并且有必要收集每个缩放比例,因为捏合缩放会将每个动作指针重置。(mScaleFactor = 1.0f) 并且所有缩放不应超过指定的限制。(MAX_ZOOM 和 MIN_ZOOM)

回收者观点:

private ScaleListener mScaleListener;
private ScaleGestureDetector mScaleGestureDetector;

@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction() & MotionEvent.ACTION_MASK;

    if(event.getPointerCount() == 2 && (action == MotionEvent.ACTION_MOVE || action == MotionEvent.ACTION_POINTER_UP)) {
        if(mScaleGestureDetector == null){
            mScaleListener = new ScaleListener(mRecyclerview, mContext);
            mScaleGestureDetector = new ScaleGestureDetector(mContext, mScaleListener);
        } return mScaleGestureDetector.onTouchEvent(event);

    }

}
Run Code Online (Sandbox Code Playgroud)

适配器:

private void changeTextSize(float mScaleFactor){
    ...
    float newFontSize = (relativeSizeSpan.getSizeChange() * mScaleFactor);
    ...
}
Run Code Online (Sandbox Code Playgroud)

规模监听器:

public class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {

    private static final float MAX_ZOOM = 2.5f;
    private static final float MIN_ZOOM = 0.5f;
    private float mScaleFactor = 1.0f;
    private ImageView mScreenShotView;
    private Context mContext; 
    private View mView;

    public ScaleListener(View mView, Context mContext) {
        this.mView = mView;
        this.mContext = mContext;
        init();
    }

    private void init(){
        int mWidth = mView.getWidth();
        int mHeight = mView.getHeight();
        if(mWidth == 0 || mHeight == 0) return;

        mScreenShotView = new ImageView(mContext);
        mScreenShotView.setLayoutParams(new ViewGroup.LayoutParams(mWidth, mHeight));

        ViewGroup mPhysicalParentLayout = (ViewGroup) mView.getParent();
        mPhysicalParentLayout.addView(mScreenShotView, mPhysicalParentLayout.indexOfChild(mView));
    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
        mScreenShotView.setBackgroundDrawable(new BitmapDrawable(Kit.getScreenshot(mView)));
        mScreenShotView.setAlpha(1f); mView.setAlpha(0f);
        return true;
    }

    @Override
    public boolean onScale(ScaleGestureDetector scaleGestureDetector){
        mScaleFactor *= scaleGestureDetector.getScaleFactor();

        mScaleFactor = Math.max(MIN_ZOOM, Math.min(mScaleFactor, MAX_ZOOM));

        mScreenShotView.setScaleX(mScaleFactor);
        mScreenShotView.setScaleY(mScaleFactor);

        return true;
    }

    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {

        ((ReadBookRcAdapter)Objects.requireNonNull(((RecyclerView)mView).getAdapter())).changeTextSize(mScaleFactor);

        mScreenShotView.animate().alpha(0f).setDuration(300).setListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationStart(Animator animation) { 
                mView.animate().alpha(1f).setDuration(300).setListener(null); 
            }
            @Override
            public void onAnimationEnd(Animator animation) {
                mScreenShotView.setScaleX(1.0f);
                mScreenShotView.setScaleY(1.0f);
                mScaleFactor = 1.0f;
            }
        });

    }


}
Run Code Online (Sandbox Code Playgroud)

ATE*_*TES 1

解决了 TextView.setTextSize() 的值限制问题。这是我的适配器类:

public class ReadBookRcAdapter extends RecyclerView.Adapter<ReadBookRcAdapter.ReadBookViewHolder> {

    private Context mContext;
    private ArrayList<ReadBookTextBlockModel> mTextViewBlocks;
    private float mTextSize;

    public ReadBookRcAdapter(Context context) {
        this.mContext = context;
        this.mTextViewBlocks = new ReadBookTextBlockModel(context).getTextBlocks();
        mTextSize = 15.0f;
    }

    class ReadBookViewHolder extends RecyclerView.ViewHolder {
        TextView mTextViewItem;

        ReadBookViewHolder(@NonNull View itemView) {
            super(itemView);
            this.mTextViewItem = itemView.findViewById(R.id.readBookTextRow);
        }

        void bind(ReadBookTextBlockModel dataList){
            if (mTextSize != 15.0f) mTextViewItem.setTextSize(mTextSize);
            mTextViewItem.setText(dataList.getBlockText());
        }

    }

    @NonNull
    @Override
    public ReadBookViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rc_item_read_book, parent, false);
        return new ReadBookViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ReadBookViewHolder holder, int position) {
        ReadBookTextBlockModel model = mTextViewBlocks.get(position);
        holder.bind(model);
    }

    public void setTextSize(float scale){

        float maxTextSize = 37.5f;
        float minTextSize = 7.5f;

        if((mTextSize == minTextSize && scale < 1.0f) || (mTextSize == maxTextSize && scale >= 1.0f))
            return;

        float newTextSize = mTextSize * scale;
        newTextSize = Math.max(minTextSize, Math.min(newTextSize, maxTextSize));

        mTextSize = newTextSize;

        Log.e("mTextSize*scale", String.valueOf(mTextSize));

        notifyDataSetChanged();
    }

}
Run Code Online (Sandbox Code Playgroud)