StickerView icon indicating copy to clipboard operation
StickerView copied to clipboard

can't access stickers at position which is saved like rotated,resized

Open adirohilla22 opened this issue 8 years ago • 26 comments

i am saving that stickers page so that i can also retrieve it later and can edit elements to existing one on page like i have saved some rotated stickers on a page but now i want to edit that page like want to change position of that rotated image or can add some more image but problem is that when i open old saved page that is having stickers it is giving me in middle and in proper default form ,not in form i edited in past 1476860268168 screenshot_20161019-122654

adirohilla22 avatar Oct 21 '16 07:10 adirohilla22

You need to save the matrix and save that and while resuming back you have to redraw them so they are on the last saved location

pravindodia avatar Jan 26 '17 02:01 pravindodia

did you find a solution for this?

ashishsakarkar2020 avatar Feb 15 '17 13:02 ashishsakarkar2020

Yes I have saved the StickerView Matrix, Bitmap as uri, and from matrix i can retrieve the coordinates and re position again on resume or on new activity wherever i want.

pravindodia avatar Feb 15 '17 14:02 pravindodia

@pravindodia how to save matrix?

Ram8948 avatar Feb 17 '17 12:02 Ram8948

when you save the object to get the matrix from the Sticker view like StickerView.getmatrix().getvalues.

If you need a sample code, just let me know.

pravindodia avatar Feb 18 '17 12:02 pravindodia

i have saved StickerPropertyModel . and use code like that: --

public void setBitmap(Bitmap bitmap, StickerPropertyModel model) { matrix.reset(); this.mBitmap = bitmap; setDiagonalLength(); initBitmaps(); int w = mBitmap.getWidth(); int h = mBitmap.getHeight(); System.out.println("...width....."+w+" ---Height--"+h); oringinWidth = w; float scale = model.getScaling() * mScreenwidth / mBitmap.getWidth(); if (scale > MAX_SCALE) { scale = MAX_SCALE; } else if (scale < MIN_SCALE) { scale = MIN_SCALE; } float degree = (float) Math.toDegrees(model.getDegree()); matrix.postRotate(-degree, w >> 1, h >> 1); matrix.postScale(scale, scale, w >> 1, h >> 1); float midX = model.getxLocation() * mScreenwidth; float midY = model.getyLocation() * mScreenwidth; System.out.println("..1...midX...."+midX+" midY "+midY); midX = midX - (w * scale) / 2-model.getOffsetX(); midY = midY - (h * scale) / 2-model.getOffsetY(); matrix.setTranslate(-w/2f, -h/2f); matrix.postRotate(-degree, w >> 1, h >> 1); matrix.postTranslate(midX,midY); matrix.postScale(scale, scale, w >> 1, h >> 1); invalidate(); }

but my problem is unable to set saved bitmap to saved matrix position . please help me on
matrix.postRotate matrix.postScale matrix.postTranslate

Ram8948 avatar Feb 18 '17 12:02 Ram8948

@Ram8948 Please check the sample code below

To Save the Parameters needed. for which i modified the StickerView

 
          for (View item : mViews) {
                   
                    ViewStateModel viewStateModel = new ViewStateModel();
                    viewStateModel.setmValues(getMatrixValues(((StickerView) item).getMatrix()));
                    viewStateModel.setViewStateId(((StickerView) item).getStickerId());
                    viewStateModel.setSaved(true);
                    viewStateModel.setStartTime(((StickerView) item).getShowPosition());
                    viewStateModel.setStopTime(((StickerView) item).getHidePosition());
                    viewStateModel.setSticker(((StickerView) item).getStickerRes());
                    mViewState.add(viewStateModel);
                }

Now to restore it back you can do this.

for (ViewStateModel item :
                    mViewList) {
                final StickerView stickerView = new StickerView(this);
                if (item.isSaved()) {
                    stickerView.getMatrix().setValues(item.getmValues());
                    stickerView.setId((int) item.getViewStateId());
                    stickerView.setSaved(item.isSaved());
                    stickerView.setImageResource(item.getSticker());
                }
                RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
                lp.height = (int) newVideoHeight;
                lp.width = (int) newVideoWidth;
                lp.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
                canvasview.addView(stickerView, lp); //canvasview is contentrootview to which we are going to add the stickers.
                mViews.add(stickerView);
                stickerView.setInEdit(false);
                stickerView.setLockMode(true);
            }

You might have to modify the stickerview to set and get the values you want.

let me know if you want to know what is the model i have used.

Hope you understand and help you to understand your requirement.

Thanks

pravindodia avatar Feb 19 '17 11:02 pravindodia

Could you explans how to use calculate in StickerView method to get this infor?

dark1991 avatar Aug 29 '17 06:08 dark1991

i have saved scaling ,translation ,rotation position from calculate method. now how to restore it back

Ram8948 avatar Feb 20 '18 07:02 Ram8948

@Ram8948 Please refer to the code above or share your code to help you with your query.

pravindodia avatar Feb 20 '18 07:02 pravindodia

i want to save matrix data for long time ,but in future if matrix reference is lost than what i can do?
i am using calculate method to save scaling, rotation, translation data

Ram8948 avatar Feb 20 '18 07:02 Ram8948

@Ram8948

  1. How would the Matrix get lost if you have saved it properly ?
  2. The code to save Matrix data is given above, if you need help to understand then ask your specific question as your question is more general and already been answered above.
  3. if you need specific help for your project please share your snippet and I can try to help you.

Please be a bit brief for some response from other people who want to help. short and general questions are difficult to answer.

pravindodia avatar Feb 20 '18 22:02 pravindodia

@pravindodia can we add these stickers in scrollview?

Kaunain26 avatar May 06 '24 13:05 Kaunain26

@pravindodia can we add these stickers in scrollview?

@Kaunain26 you can but it will not not editable in scollview, or even if you make it editable it will not be a good User Experience.

pravindodia avatar May 06 '24 13:05 pravindodia

@pravindodia can we add these stickers in scrollview?

@Kaunain26 you can but it will not not editable in scollview, or even if you make it editable it will not be a good User Experience.

Actually my requirement is a scroll view. I am creating a notes app in which users can add stickers in it. So if the user scrolls the view then I don't think sticker could go down.

Kaunain26 avatar May 07 '24 11:05 Kaunain26

@pravindodia can we add these stickers in scrollview?

@Kaunain26 you can but it will not not editable in scollview, or even if you make it editable it will not be a good User Experience.

Actually my requirement is a scroll view. I am creating a notes app in which users can add stickers in it. So if the user scrolls the view then I don't think sticker could go down.

@Kaunain26 it can but you have to handle that in parent view and use a separate view for create/edit stickerview and then insert the sticker in parent view with scroll and it will work.

pravindodia avatar May 07 '24 12:05 pravindodia

@pravindodia can we add these stickers in scrollview?

@Kaunain26 you can but it will not not editable in scollview, or even if you make it editable it will not be a good User Experience.

Actually my requirement is a scroll view. I am creating a notes app in which users can add stickers in it. So if the user scrolls the view then I don't think sticker could go down.

@Kaunain26 it can but you have to handle that in parent view and use a separate view for create/edit stickerview and then insert the sticker in parent view with scroll and it will work.

                    `
  <?xml version="1.0" encoding="utf-8"?>
        <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto"
         xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior">


<RelativeLayout
    android:id="@+id/rl_content_root"
    android:layout_width="match_parent"
    android:layout_height="2000dp">


</RelativeLayout>

          </androidx.core.widget.NestedScrollView>

`

I tried to modify it like this , i made parent scrollView and added relativeLayout in that parent . But in this way sticker is not getting added. can u help?

Kaunain26 avatar May 07 '24 12:05 Kaunain26

@pravindodia

                     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rl_content_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="@string/appbar_scrolling_view_behavior">


<androidx.core.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="2000dp">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_background"/>

</androidx.core.widget.NestedScrollView>

</RelativeLayout>

this modified XML is working fine.

I just did opposite of the above give code of mine

Is this correct... in this way stickers are coming on the view.

Kaunain26 avatar May 07 '24 12:05 Kaunain26

This is the wrong approach, what I am saying is your sticker will be in scroll view and if you want to edit the sticker then there should be different view which is sticker view The way you have planned will not work

pravindodia avatar May 07 '24 12:05 pravindodia

This is the wrong approach, what I am saying is your sticker will be in scroll view and if you want to edit the sticker then there should be different view which is sticker view The way you have planned will not work

sorry but i am not getting it. Can you plz give me a code example if you are free.

Kaunain26 avatar May 07 '24 12:05 Kaunain26

Sorry For what I am telling I cannot give you a sample code but I can try to explain here for example

As you said you are creating a notes app So there are 2 view

  1. note view
  2. note edit view

so not both can have scroll view in it.

Main View (Any Layout you want) Then Scroll view or main layout can be scroll view Then your Notes including sticker view(Not editable its like an image(sticker))

When you want to edit the sticker view from not edit view, Move to different Activity and Edit sticker view layouts do your work and return when done.

That's it. I am not sure If I made my self clear, but I cannot be more clear than this. Sorry.

pravindodia avatar May 07 '24 14:05 pravindodia

@pravindodia Thank you so much for your quick replies, whatever you are saying i understood and I achieved 50% of my requirement. But the problem is Sticker view is not able to move properly in Scrollview. It started colliding the view , I mean started scrolling both at the same time when trying to move the sticker.

So what i am thinking is it possible to add a one more sticker view which will be outside of this parent nestedScrollview ( this parent nestedScrollView already contains the stickerView.) So user interaction will be with the sticker view which is outside the parent nestedScrollview and when user will move or edit the sticker then same time it update the other sticker view which is inside the parent nestedScrollView.

This idea i got from your above comment only. It's little bit different. I don't know it is possible or not.

Kaunain26 avatar May 07 '24 14:05 Kaunain26

@Ram8948 Please check the sample code below

To Save the Parameters needed. for which i modified the StickerView

      for (View item : mViews) {
               
                ViewStateModel viewStateModel = new ViewStateModel();
                viewStateModel.setmValues(getMatrixValues(((StickerView) item).getMatrix()));
                viewStateModel.setViewStateId(((StickerView) item).getStickerId());
                viewStateModel.setSaved(true);
                viewStateModel.setStartTime(((StickerView) item).getShowPosition());
                viewStateModel.setStopTime(((StickerView) item).getHidePosition());
                viewStateModel.setSticker(((StickerView) item).getStickerRes());
                mViewState.add(viewStateModel);
            }

Now to restore it back you can do this.

for (ViewStateModel item : mViewList) { final StickerView stickerView = new StickerView(this); if (item.isSaved()) { stickerView.getMatrix().setValues(item.getmValues()); stickerView.setId((int) item.getViewStateId()); stickerView.setSaved(item.isSaved()); stickerView.setImageResource(item.getSticker()); } RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); lp.height = (int) newVideoHeight; lp.width = (int) newVideoWidth; lp.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); canvasview.addView(stickerView, lp); //canvasview is contentrootview to which we are going to add the stickers. mViews.add(stickerView); stickerView.setInEdit(false); stickerView.setLockMode(true); } You might have to modify the stickerview to set and get the values you want.

let me know if you want to know what is the model i have used.

Hope you understand and help you to understand your requirement.

Thanks

hey @pravindodia can you provide the code, that you modified in StickerView to get the values and what model you used.

Kaunain26 avatar May 08 '24 08:05 Kaunain26

@Kaunain26 sorry but I did this project 8 years ago and so I don't have the code.

pravindodia avatar May 08 '24 08:05 pravindodia

(getMatrixValues(((StickerView) item).getMatrix()))

(getMatrixValues(((StickerView) item).getMatrix())) can you explain this plz. How you are getting the matrix value.

When i am trying to get this sticker.getMatrix() then everytime it's value is same.

Kaunain26 avatar May 08 '24 08:05 Kaunain26

(getMatrixValues(((StickerView) item).getMatrix()))

(getMatrixValues(((StickerView) item).getMatrix())) can you explain this plz. How you are getting the matrix value.

When i am trying to get this sticker.getMatrix() then everytime it's value is same.

StickerView item is modified to save and get matrix values , its parent class already has that methods which you can override. and you can get and set the values as you require. The value is changed when its location is changed on StickerView For example you have a text and an image both will have its own matrix value and it will same if they both are on the sample place, if the location is changed then the value changes.

pravindodia avatar May 08 '24 10:05 pravindodia