How To apply click listener?
Asked Answered
P

1

4

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 page curl work  properly unfortunatly onclick listener is not working please anyone suggest me

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.

Pullen answered 13/12, 2012 at 12:1 Comment(3)
Hi anyone may I know reason of -ve rating?Pullen
hi do you know how to include on click listener on each page with harism library ?Gambol
@Pullen i am also facing same problem,is your requirement done(achieved) for layout buttons or text clickable?Masquer
C
4

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.

Culmination answered 7/1, 2013 at 11:35 Comment(1)
hey, I have put my curlview inside a linear layout but still I am not able to get the click event on it or the touch event what should I do to achieve this. As the curlview touch events working like before doing this. doesn't make any difference or how do I send curlview to backPhototube

© 2022 - 2024 — McMap. All rights reserved.