How To apply click listener?

守給你的承諾、 提交于 2019-12-22 09:08:38

问题


I am making an application by using page curl for that am using this link:-

    https://github.com/harism/android_page_curl.

In that link implementing page curl using bitmap.But My requirement is that curl to View ,for that I convert View(LinearLayout) into bitmap and set onclicklistener on child view, for more clarification please see attached image

My code is as:-

public static LinearLayout createProgrammeView(final Context context,
        int width, int height, String title, String time) {


    // Upper layout of screen
    LinearLayout objmainlayout = new LinearLayout(context);

    if (height >= 320) {
        objmainlayout.setLayoutParams(new LayoutParams(
                LayoutParams.FILL_PARENT, (height -100)));
        Log.e("chectttttttttttlayout",""+(height-71));
    } else {
        objmainlayout.setLayoutParams(new LayoutParams(
                LayoutParams.FILL_PARENT, (height - 90)));
    }
    objmainlayout.setBackgroundColor(Color.WHITE);
    objmainlayout.setOrientation(LinearLayout.VERTICAL);
    objmainlayout.setPadding(10, 0, 10,0);


    for (int mindex = 0; mindex <3; mindex++)
    {
        RelativeLayout.LayoutParams objparams;
        // Layout Root View (RelativeLayout)

        RelativeLayout objrelativeinnerlayout = new RelativeLayout(context);
        if (height >= 320) 
        {
            objparams = new RelativeLayout.LayoutParams(width-20,
                    ((height - 71) / 3) - 10);
            Log.e("chectt33333tlayout",""+(((height - 71) / 3) - 10));
        } else {
            objparams = new RelativeLayout.LayoutParams(width,
                    ((height - 90) / 3) - 10);
        }
        //objparams.topMargin=10;
        objrelativeinnerlayout.setLayoutParams(objparams);
        // rlv.setBackgroundResource(R.drawable.sss);
        // rlv.setBackgroundResource(R.drawable.sss);


        ImageView objrow1img1 = new ImageView(context);
        if (height >= 320) {
            objrow1img1.setLayoutParams(new RelativeLayout.LayoutParams(
                    (width - 30) / 2,((height - 71) / 3) - 10));
        }
        objrow1img1.setScaleType(ScaleType.FIT_XY);

        RelativeLayout.LayoutParams objlp = (RelativeLayout.LayoutParams) objrow1img1.getLayoutParams();

        objlp.topMargin=10;
        objlp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        objrow1img1.setId(1);
        objrow1img1.setBackgroundColor(Color.RED);

        if (mindex == 0) {
            objrow1img1.setImageResource(R.drawable.fblogin);
            objrow1img1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    Toast.makeText(context,"onclick",Toast.LENGTH_LONG).show();
                    Log.e("check click","good");
                    //Intent objIntent = new Intent(context,
                            //FacebookAlbumList.class);
                    //objcoContext.startActivity(objIntent);
                }
            });
        }
        else {/*
            if (data != null
                    && data.size() > saveindex
                    && data.get(saveindex) != null
                    && data.get(saveindex).get(0) != null
                    && data.get(saveindex).get(0).getImagepath() != null) {
                objrow1img1.setVisibility(View.VISIBLE);
                System.gc();
                decodeBitMap(data.get(index).get(0).getImagepath(),
                        objrow1img1);
            } else {
                objrow1img1.setVisibility(View.INVISIBLE);
            }
        */}
        objrelativeinnerlayout.addView(objrow1img1);

        ImageView objrow1img2 = new ImageView(context);
        objrow1img2.setLayoutParams(new RelativeLayout.LayoutParams(
                (width - 30) / 2,((height - 71) / 3) - 10));
        objrow1img2.setScaleType(ScaleType.FIT_XY);
        objrow1img2.setBackgroundColor(Color.RED);

        RelativeLayout.LayoutParams objlrelativelayoutparam = (RelativeLayout.LayoutParams) objrow1img2
                .getLayoutParams();
        objlrelativelayoutparam.setMargins(10, 10, 0, 0);
        objlrelativelayoutparam.addRule(RelativeLayout.RIGHT_OF,1);

        objrelativeinnerlayout.addView(objrow1img2);

        objmainlayout.addView(objrelativeinnerlayout);

    }
    return objmainlayout;
}

public static Bitmap loadBitmapFromView(LinearLayout v) {
    v.measure(MeasureSpec.makeMeasureSpec(v.getLayoutParams().width,
            MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(
            v.getLayoutParams().height, MeasureSpec.EXACTLY));
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

    Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(),
            Bitmap.Config.RGB_565);
    Canvas c = new Canvas(b);
    v.draw(c);
    return b;
}

Here I put code of Myview and converting it into bitmap.Problem is that How I can get onclickListener on that? Please anyone suggest me thanks in advance.


回答1:


I ran into a similar problem and. To get it working I have a parent layout (contentContainer) which contains 2 subviews:

  • Content view which is converted to bitmap when curling
  • CurlView (OpenGL Surface)

I had to set an onClickListener to the parent layout to catch the events and send or not send them to the CurlView. When the events are sent to the CurlView, the CurlView is brought to front (using bringToFront() method). Otherwise, the content view is brought to front.

To decide if events are sent or not to the CurlView I use a method that returns true if the tap was within the page curl area (aprox. 1/6 of the screen, both sides). Additionally I have a gesture and scale detectors to detect singleTap and longPress, which is what we need for user interaction. When a singleTap or longPress is catched, the postion (x,y) tells me where the user touched so I can launch some activity, show a context menu or whatever.

Some sample code:

    contentContainer.setOnClickListener(null); // DO NOT REMOVE THIS, IT'S A WORKAROUND
    contentContainer.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            gestureDetector.onTouchEvent(event);
            mScaleDetector.onTouchEvent(event);

            int x = (int)event.getX();
            int y = (int)event.getY();

            boolean isMoving = event.getAction() == MotionEvent.ACTION_MOVE;
            boolean isTouchDown = event.getAction() == MotionEvent.ACTION_DOWN;
            boolean isTouchUp = event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL;
            boolean pageCurlArea = isPageCurlArea(x, y);

            boolean sendEventToCurlView = false;

            if (isTouchDown && pageCurlArea) {
                downInPageArea = true;
                sendEventToCurlView = true;
            } else if (downInPageArea && isMoving) {
                sendEventToCurlView = true;
            } else if (downInPageArea && isTouchUp) {
                downInPageArea = false;
                sendEventToCurlView = true;
            } else if (!downInPageArea && isMoving) {
                return false;
            }

            if (downInPageArea && isMoving && !curlViewIsOnTop) {
                bringCurlViewToFront();
            }

            if (sendEventToCurlView) {
                MotionEvent mEvent = MotionEvent.obtain(event);
                mCurlView.onTouch(v, mEvent);
            }

            return !sendEventToCurlView;
        }
    });

It is a work in progress yet, because I need to modify it to not use "page curl area" to discriminate between "curl event" and other events (singleTap, longPress...), for which I plan to use both the gesture and scale detectors to return if an event was catched and depending on the result, continue sending the event to the CurlView or not. This is necessary to perform "taps" and "longPress" within the 1/6 page curl area.

Hope it helps.



来源:https://stackoverflow.com/questions/13859425/how-to-apply-click-listener

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!