扩大View的点击区域

工具类:
public class ViewUtils {
    public static void setTouchDelegate(View view, int expandLeftValue, int expandTopValue, int expandRightValue, int expandBottomValue) {
        View parentView = (View) view.getParent();
        parentView.post(new Runnable() {
            @Override
            public void run() {
                Rect rect = new Rect();
                view.getHitRect(rect); //这个方法后rect里面便有了值
                rect.left -= DpUtils.dip2px(view.getContext(), expandLeftValue);
                rect.top -= DpUtils.dip2px(view.getContext(), expandTopValue);
                rect.right += DpUtils.dip2px(view.getContext(), expandRightValue);
                rect.bottom += DpUtils.dip2px(view.getContext(), expandBottomValue);
                parentView.setTouchDelegate(new TouchDelegate(rect, view)); //委托给parentView
            }
        });
    }
}
一个转换工具类:
public class DpUtils {


    /**
     * 根据手机的分辨率从 dip 的单位 转成为 px(像素)
     */
    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    /**
     * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
     */
    public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
    }

    /**
     * 将px值转换为sp值,保证文字大小不变
     */
    public static int px2sp(Context context, float pxValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (pxValue / fontScale + 0.5f);
    }

    /**
     * 将sp值转换为px值,保证文字大小不变
     */
    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }


}
项目中使用:
image.png

参考:https://www.jianshu.com/p/80da2aec5dbc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中,可以通过QGraphicsView类实现图形界面的绘制和交互。如果想要实现QGraphicsView区域选择的功能,可以使用QRubberBand类。 QRubberBand类是一个用于绘制矩形框的类,可以通过鼠标拖动的方式实现矩形的绘制。将QRubberBand类和QGraphicsView类结合起来使用,可以实现QGraphicsView区域选择的功能。 以下是一个基本的示例代码: ```cpp #include <QtWidgets> class GraphicsView : public QGraphicsView { public: GraphicsView(QWidget* parent = nullptr) : QGraphicsView(parent) { setRubberBandSelectionMode(Qt::IntersectsItemBoundingRect); } protected: void mousePressEvent(QMouseEvent* event) override { if (event->button() == Qt::LeftButton) { m_origin = event->pos(); if (!m_rubberBand) m_rubberBand = new QRubberBand(QRubberBand::Rectangle, this); m_rubberBand->setGeometry(QRect(m_origin, QSize())); m_rubberBand->show(); } QGraphicsView::mousePressEvent(event); } void mouseMoveEvent(QMouseEvent* event) override { if (m_rubberBand) m_rubberBand->setGeometry(QRect(m_origin, event->pos()).normalized()); QGraphicsView::mouseMoveEvent(event); } void mouseReleaseEvent(QMouseEvent* event) override { if (event->button() == Qt::LeftButton) { if (m_rubberBand) { m_rubberBand->hide(); QRectF rect = mapToScene(m_rubberBand->geometry()).boundingRect(); emit selectionChanged(rect); } } QGraphicsView::mouseReleaseEvent(event); } signals: void selectionChanged(const QRectF& rect); private: QRubberBand* m_rubberBand = nullptr; QPoint m_origin; }; class MainWindow : public QMainWindow { public: MainWindow(QWidget* parent = nullptr) : QMainWindow(parent) { QGraphicsScene* scene = new QGraphicsScene(this); for (int i = 0; i < 100; ++i) { QGraphicsRectItem* item = scene->addRect(i * 50, 0, 50, 50); item->setBrush(Qt::blue); } m_view = new GraphicsView(this); m_view->setScene(scene); connect(m_view, &GraphicsView::selectionChanged, this, &MainWindow::onSelectionChanged); setCentralWidget(m_view); } private: void onSelectionChanged(const QRectF& rect) { qDebug() << "Selection changed:" << rect; } GraphicsView* m_view; }; int main(int argc, char* argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } ``` 在上述代码中,我们首先继承了QGraphicsView类,并重写了mousePressEvent、mouseMoveEvent和mouseReleaseEvent等事件处理函数。在mousePressEvent中,我们使用QMouseEvent的pos函数获取鼠标点击位置,如果是左键按下,则创建QRubberBand对象,并设置它的起始位置为鼠标点击位置。在mouseMoveEvent中,我们不断更新QRubberBand的位置和大小以跟随鼠标移动。在mouseReleaseEvent中,我们获取QRubberBand的位置和大小,并使用mapToScene函数将其转换为场景坐标系下的矩形,然后通过信号selectionChanged将其传递出去。 在MainWindow类中,我们创建了一个QGraphicsScene,并向其中添加了100个蓝色矩形。然后我们创建了一个GraphicsView对象,并将其设置为主窗口的中心窗口。最后我们连接了GraphicsView的selectionChanged信号到onSelectionChanged槽函数,以便在选择区域发生变化时进行响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值