داینامیک کردن عکس ها!
سلام، من از این کلاس برای قرار دادن عکس بین متن ها استفاده میکنم :
public class TextViewWithImages extends TextView {
public TextViewWithImages(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public TextViewWithImages(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TextViewWithImages(Context context) {
super(context);
}
private void initialize() {
if (!isInEditMode()) {
String size = G.preferences.getString("FONT_SIZE", "20");
float size1 = Float.parseFloat(size);
Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/bnazanin.ttf");
setTypeface(tf);
setTextSize(size1);
}
}
@Override
public void setText(CharSequence text, BufferType type) {
Spannable s = getTextWithImages(getContext(), text);
super.setText(s, BufferType.SPANNABLE);
initialize();
}
private static final Spannable.Factory spannableFactory = Spannable.Factory.getInstance();
private static boolean addImages(Context context, Spannable spannable) {
Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E");
boolean hasChanges = false;
Matcher matcher = refImg.matcher(spannable);
while (matcher.find()) {
boolean set = true;
for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) {
if (spannable.getSpanStart(span) >= matcher.start()
&& spannable.getSpanEnd(span) <= matcher.end()
) {
spannable.removeSpan(span);
} else {
set = false;
break;
}
}
String resname = spannable.subSequence(matcher.start(1), matcher.end(1)).toString().trim();
int id = context.getResources().getIdentifier(resname, "drawable", context.getPackageName());
if (set) {
hasChanges = true;
spannable.setSpan( new ImageSpan(context, id),
matcher.start(),
matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
);
}
}
return hasChanges;
}
private static Spannable getTextWithImages(Context context, CharSequence text) {
Spannable spannable = spannableFactory.newSpannable(text);
addImages(context, spannable);
return spannable;
}
}
اما مشکل اینه که وقتی یه عکس میزارم اگه اندازه اش بیشتر از 300 یا 400 باشه duplicate میشه که هیچی! از صفحه هم میره بیرون! میخوام اگه راهی هست معرفی کنید که اندازه عکس ها را match_parent کنم با استفاده از این کلاس! ممنون
کمی کلاس خودتو تغییر دادم (البته تو ادیتور سایت ، منظورم رسوندن ایده بود)
در موردش نظرتو بگو:
public class Parser extends LinearLayout {
private float textSize;
private Typeface typeface;
public Parser(Context context) {
super(context);
}
public Parser(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setText(String text) {
if (isInEditMode()) {
return;
}
String size = G.preferences.getString("FONT_SIZE", "20");
textSize = Float.parseFloat(size);
typeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/bnazanin.ttf");
Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q/]\\E");
Matcher matcher = refImg.matcher(text);
while (matcher.find()) {
//Add TextView with textSize&typeface
//OR
//Add ImageView with custom configs
}
}
}
برای اینکه از کد بالا استفاده کنید باید متنتون به این شکل باشه، البته HTML بودنش دلخواهیه!
<html>
<head>
<title></title>
</head>
<body>
<div style="direction: rtl;">
<div>[img src=in/]</div>
<div id="pastingspan1">Sample <strong>Text</strong> text - text - ...</div>
</div>
</body>
</html>
برای پارسی کردن (تجزیه کردن) html کد بالا قابل استفاده نیست
کدی قابل تجزیه هستش که تکه هاش به هم وابستگی نداشته باشن »
[img src=in/]
<div id="pastingspan1">Sample <strong>Text</strong> text - text - ...</div>
[img src=in/]
<div id="pastingspan1">Sample 2 <strong>Text</strong> text - text - ...</div>
[img src=in/]
<div id="pastingspan1">Sample 3 <strong>Text</strong> text - text - ...</div>
کد بالا قابل تجزیس - البته در صورتیکه بخوای تو کنترل های مختلف بذاریشون
برای تجزیه html مثال رو برای یه اکتیویتی نوشتم که تو layout فقط یه LinearLayout داره :
public class MainActivity extends Activity {
private LinearLayout lilLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String html = "[img src=image1]" +
"<div>Sample 1 <strong>Text</strong> text - text - ...</div>" +
"[img src=image2]" +
"<div>Sample 2 <strong>Text</strong> text - text - ...</div>" +
"[img src=image3]" +
"<div>Sample 3 <strong>Text</strong> text - text - ...</div>";
lilLayout = (LinearLayout) findViewById(R.id.lilLayout);
Pattern refImg = Pattern.compile("\\Q[img src=\\E([a-zA-Z0-9_]+?)\\Q]\\E");
Matcher matcher = refImg.matcher(html);
int lastIndex = 0;
while (matcher.find()) {
String text = html.substring(lastIndex, matcher.start(1)).replace("[img src=", "").replace("]", "");
AddTextView(text);
String resname = html.substring(matcher.start(1), matcher.end(1));
AddImageView(resname);
lastIndex = matcher.end(1);
}
String text = html.substring(lastIndex, html.length()).replace("[img src=", "").replace("]", "");
AddTextView(text);
}
private void AddImageView(String resname) {
ImageView imageView = new ImageView(this);
int id = getResources().getIdentifier(resname, "drawable", getPackageName());
imageView.setImageResource(id);
lilLayout.addView(imageView);
}
private void AddTextView(String text) {
TextView textView = new TextView(this);
textView.setText(Html.fromHtml(text));
lilLayout.addView(textView);
}
}
با یه رشته html ثابت و فرضی با قوانینی که تو جواب قبلی گفتم شروع شده و تو هر مرحله بنا به نیاز متن یا تصویر به LinearLayout اضافه شدن.
برای مرتب کردن صفحه هم کافیه موارد مورد نیاز رو به 2 تا تابعی که وظیفه اضافه کردن عکس و متن رو دارن، اضافه کنیم
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .